How to keep user Logged-In always “Connected with Server”
我正在开发一个应用程序,我希望用户保持登录状态,这意味着在成功登录后总是连接到服务器(就像facebook应用程序一样)。 我试图谷歌这个,但没有找到任何正确的逻辑。 许多网站建议使用
我是android noob。
在设备上存储用户凭据不是一种好的设计方法。您可以存储
这个过程的基本设计
教程:
- 寻找基本教程
- 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); |
首先,我不理解你的案例中使用术语
要保持登录状态,不要每次都要求提供凭据,您应该从服务器获取一个唯一的令牌,并将其与其他登录详细信息(密码除外)一起存储在SharedPreferences或某些数据库中。每当用户打开应用程序时,使用收到的令牌作为身份验证参数(您也可以参考誓言方法)。这将消除泄密密码的可能性,令牌将特定于设备,就像会话一样。
保持与服务器的连接,例如,接收即时通知,发送和接收消息?当应用程序打开时,使用套接字,就是这样做,当应用程序关闭时,您可以使用FCM。
你的问题似乎并不清楚。
1)总是连接到服务器是什么意思?
2)如果用户连接到服务器,您需要做什么样的事情?
如果您希望用户在您的应用中始终登录,我建议您使用
如果您需要一些时间信息,如需要每天或每小时更新数据,您可以使用
您仍然希望某些信息通知用户有关新的更改/更新,您可以使用Push Notifications.GCM和FCM
注意 :
Firebase Cloud Messaging (FCM) is the new version of GCM.