如何使用户登录始终“与服务器连接”

时间:2016-09-19 14:58:03

标签: android session server stay-logged-in

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

我是android noob。

5 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

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

此流程的基本设计

enter image description here

教程:

答案 2 :(得分:0)

你的问题似乎并不清楚。

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

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

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

您仍然想要一些信息来通知用户有关新的更改/更新,您可以使用推送通知。GCMFCM

注意:

  

Firebase云消息传递(FCM)是GCM的新版本。

答案 3 :(得分:0)

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

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

  2. 保持与服务器的连接,例如,接收即时通知,发送和接收消息?当应用程序打开时,使用套接字,它是如何完成的,当应用程序关闭时,您可以使用FCM。

答案 4 :(得分:0)

尝试这项工作对我来说..

<强> sessionManager.java

   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);
    }

}

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

 SessionManager session;

将此代码粘贴到onCreate()

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