关于android:如何让用户登录始终“与服务器连接”

How to keep user Logged-In always “Connected with Server”

我正在开发一个应用程序,我希望用户保持登录状态,这意味着在成功登录后总是连接到服务器(就像facebook应用程序一样)。 我试图谷歌这个,但没有找到任何正确的逻辑。 许多网站建议使用SharedPreference但保留用户的登录信誉。 在SheredPreference上并不是一个好主意,并没有提供任何答案来保持与服务器的连接。 我有点坚持这个想法。 我只需要逻辑来实现这一点。 欢迎任何建议和示例代码。

我是android noob。


在设备上存储用户凭据不是一种好的设计方法。您可以存储Hash密码,该密码也被拒绝为良好的应用程序设计技术。根据facebook和谷歌这些技术巨头使用Authentication令牌登录注销。用户登录服务器后,为特定用户生成令牌,然后将其存储在您的设备和服务器上。下次用户访问App时,已经请求检查令牌是否有效,如果有效,则授予其他权限。

这个过程的基本设计

enter image description here

教程:

  • 寻找基本教程
  • Facebook登入

首先,理想情况下,您应该在用户登录时生成令牌(Facebook应用程序也使用oauth令牌),然后应将其存储在您的设备和服务器上。即使在手机上存储电子邮件地址或任何其他此类用户信息也不是一个好主意。

在服务器端创建和维护会话。接下来,让应用程序连接到母舰,即设置间隔后的服务器,并发送"我还活着"消息。如果您在服务器端收到消息,则会增加会话时间。

这样,用户永远保持登录状态,但前提是用户保持活动状态。

服务器和应用程序必须首先检查会话和令牌,然后再发送或接收数据。这可确保用户获得授权,应用程序未强制关闭,并且用户仍保持连接状态。如果您想要更多信息,请进一步询问。


试试这个为我工作..

sessionManager.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
   package com.example.sachin.splashlogin;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;

import java.util.HashMap;

public class SessionManager {

    SharedPreferences pref;

    // Editor for Shared preferences
    Editor editor;

    // Context
    Context _context;

    // Shared pref mode
    int PRIVATE_MODE = 0;

    // Sharedpref file name
    private static final String PREF_NAME ="SocialPref";

    // All Shared Preferences Keys
    private static final String IS_LOGIN ="IsLoggedIn";

    // User name (make variable public to access from outside)
    public static final String KEY_NAME ="email";

    // Email address (make variable public to access from outside)
    public static final String KEY_ID ="user_id";

    // Constructor
    public SessionManager(Context context){
        this._context = context;
        pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
        editor = pref.edit();
    }

    /**
     * Create login session
     * */
    public void createLoginSession(String email, String userid){
        // Storing login value as TRUE
        editor.putBoolean(IS_LOGIN, true);

        // Storing name in pref
        editor.putString(KEY_NAME, email);

        // Storing email in pref
        editor.putString(KEY_ID, userid);

        // commit changes
        editor.commit();
    }  

    /**
     * Check login method wil check user login status
     * If false it will redirect user to login page
     * Else won't do anything
     * */
    public void checkLogin(){
        // Check login status
        if(!this.isLoggedIn()){
            // user is not logged in redirect him to Login Activity
            Intent i = new Intent(_context, com.example.sachin.splashlogin.Login.class);
            // Closing all the Activities
            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

            // Add new Flag to start new Activity
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            // Staring Login Activity
            _context.startActivity(i);
        }

    }



    /**
     * Get stored session data
     * */
    public HashMap<String, String> getUserDetails(){
        HashMap<String, String> user = new HashMap<String, String>();
        // user name
        user.put(KEY_NAME, pref.getString(KEY_NAME, null));

        // user email id
        user.put(KEY_ID, pref.getString(KEY_ID, null));

        // return user
        return user;
    }

    /**
     * Clear session details
     * */
    public void logoutUser(){
        // Clearing all data from Shared Preferences
        editor.clear();
        editor.commit();

        editor.putBoolean(IS_LOGIN, false);
        // After logout redirect user to Loing Activity
        Intent i = new Intent(_context, Login.class);
        // Closing all the Activities
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        // Add new Flag to start new Activity
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        // Staring Login Activity
        //_context.startActivity(i);
    }

    /**
     * Quick check for login
     * **/
    // Get Login State
    public boolean isLoggedIn(){
        return pref.getBoolean(IS_LOGIN, false);
    }

}

在每个新屏幕中,您只需要粘贴此代码..

1
 SessionManager session;

将此代码粘贴到onCreate()中

1
2
3
 session = new SessionManager(getApplicationContext());
        HashMap<String, String> user = session.getUserDetails();
        struid = user.get(SessionManager.KEY_NAME);

首先,我不理解你的案例中使用术语stay connected to serverstay logged in。但据我了解,我会回答这个问题。

  • 要保持登录状态,不要每次都要求提供凭据,您应该从服务器获取一个唯一的令牌,并将其与其他登录详细信息(密码除外)一起存储在SharedPreferences或某些数据库中。每当用户打开应用程序时,使用收到的令牌作为身份验证参数(您也可以参考誓言方法)。这将消除泄密密码的可能性,令牌将特定于设备,就像会话一样。

  • 保持与服务器的连接,例如,接收即时通知,发送和接收消息?当应用程序打开时,使用套接字,就是这样做,当应用程序关闭时,您可以使用FCM。


  • 你的问题似乎并不清楚。

    1)总是连接到服务器是什么意思?
    2)如果用户连接到服务器,您需要做什么样的事情?

    如果您希望用户在您的应用中始终登录,我建议您使用SharedPreferences,无需在SharedPreferences中存储用户凭据,您可以存储userId,电子邮件地址和那些详细信息.SharePreferences

    如果您需要一些时间信息,如需要每天或每小时更新数据,您可以使用AlarmManager在给定时间内调用API.AlarmManager

    您仍然希望某些信息通知用户有关新的更改/更新,您可以使用Push Notifications.GCM和FCM

    注意 :

    Firebase Cloud Messaging (FCM) is the new version of GCM.