使用共享首选项创建用户登录会话



首先,请允许我指出,我是Android开发的新手,此时此刻我正在尝试使用SharedPreferences存储用户登录会话,并且已经做了一些事情来为自己创建一个类SessionManager来处理这个问题,无论如何我都没有收到任何错误,但是,每次登录时,我都会很快再次重定向到LoginActivty。

会话管理器.java

package com.example.drawerlayout;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import java.util.HashMap;

public class SessionManager {
SharedPreferences sharedPreferences;
public SharedPreferences.Editor editor;
public Context context;
int PRIVATE_MODE = 0;
private static final String PREF_NAME = "LOGIN";
private static final String LOGIN = "IS_LOGIN";
public static final String NAME = "NAME";
public static final String EMAIL = "EMAIL";
public static final String TYPE = "TYPE";
public SessionManager(Context context) {
this.context = context;
sharedPreferences = context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
editor = sharedPreferences.edit();
}

public void createSession(String name, String email, String type){
editor.putBoolean(PREF_NAME, true);
editor.putString(NAME, name);
editor.putString(EMAIL, email);
editor.putString(TYPE, type);
editor.apply();
}
public boolean isLoggedIn(){
return sharedPreferences.getBoolean(LOGIN, false);
}
public void checkLoggin(){
if (!this.isLoggedIn()){
Intent i = new Intent(context, LoginActivity.class);
context.startActivity(i);
((MainActivity) context).finish();
}
}
public HashMap<String, String> getUserDetails(){
HashMap<String, String> user = new HashMap<>();
user.put(NAME, sharedPreferences.getString(NAME, null));
user.put(EMAIL, sharedPreferences.getString(EMAIL, null));
user.put(TYPE, sharedPreferences.getString(TYPE, null));
return user;
}

public void logOut(){
editor.clear();
editor.commit();
Intent i = new Intent(context, LoginActivity.class);
context.startActivity(i);
((MainActivity) context).finish();
}
}

SessionManager.java在 LoginActivity 中使用,如下所示:

String name = details.getString("username").trim();
String email = details.getString("email").trim();
String type = details.getString("type").trim();
//CREATE SESSION
sessionManager.createSession(name,email,type);

主活动中.java

sessionManager = new SessionManager(this);
sessionManager.checkLoggin();

您在createSession方法中更新了错误的键。

createSession中将PREF_NAME替换为LOGIN。您的代码将按预期工作。

public void createSession(String name, String email, String type){
// Check below line...
editor.putBoolean(LOGIN, true);
editor.putString(NAME, name);
editor.putString(EMAIL, email);
editor.putString(TYPE, type);
editor.apply();
}

再次查看您的字符串变量名称!

  • String PREF_NAME是为了获得偏好。

  • String LOGIN用于对值进行寻址以检查用户是否已登录

你的错误:

  • 函数 创建会话(字符串名称、字符串电子邮件、字符串类型(
    1. 您正在更新String PREF_NAME的值而不是String LOGIN

溶液:

  • 函数 创建会话(字符串名称、字符串电子邮件、字符串类型(
    1. 更新会话管理器29 行中的String LOGIN值而不是String PREF_NAME值.java

很可能您忘记在会话管理器的创建会话中放置一个布尔字段 LOGIN。 修改创建会话方法,如下所示

public void createSession(String name, String email, String type,Boolean isLoggedIn){
editor.putString(NAME, name);
editor.putString(EMAIL, email);
editor.putString(TYPE, type);
editor.putBoolean(LOGIN,isLoggedIn)
editor.apply();
}

然后,如果在登录活动中登录成功,则像这样调用

String name = details.getString("username").trim();
String email = details.getString("email").trim();
String type = details.getString("type").trim();
//CREATE SESSION
sessionManager.createSession(name,email,type,true);

好吧,共享首选项值保存在包含其键和值的 xml 文件中,因此每个值都将在第一次尝试登录时生成,所以你为什么不检查共享首选项中是否存在任何值,或者通过这种方式.. 将此代码放入您的会话处理程序

public static boolean preferenceExists(String key){
return  sharedPreferences.contains(key);
}

如果存在任何值,它将返回布尔标志,因此只需检查首选项是否存在((即可。如果没有,则重定向它进行登录活动,否则重定向到您想要的位置

建议:创建启动画面,您可以在其中验证这些内容

最新更新