首页 > 解决方案 > Android 登录验证 API

问题描述

我通过 api 使用令牌进行了简单的登录,我从服务器获取令牌并将其保存到 SharedPreferences。我的问题是我现在应该做什么,我的想法是检查用户是否有令牌然后跳过登录过程。我的 MainActivity.java 中有登录逻辑,就在 onCreate 中,我知道它不应该在那里,但我应该在哪里设置它?

这就是我从服务器获取响应并保存它的方式

User user = response.body();

if (user != null) {
    int id = user.getId();
    String name = user.getName();
    String lastname = user.getLastname();
    String maidenname = user.getMaidenname();
    String card = user.getCard();
    String scard = user.getScard();
    String email = user.getEmail();
    String token = user.getToken();

    User current = new User(id, name, lastname, maidenname, card, scard, email, token);

    SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();

    editor.putString(TOKEN, current.getToken());
    editor.apply();

我为当前登录的用户创建了一个用户模型,我应该将它保存在其他地方还是以后如何从所有活动中访问它?

有什么建议么?

标签: android

解决方案


如果您想存储一些用户信息并从任何活动中访问它,我认为最好的方法是将其存储在 SharedPreferences 中并创建一个帮助类来获取和设置这些值在首选项中。例如:

public class SharedPreferencesHelper {

    private static final String USER_ID = "USER_ID";
    private static final String USER_NAME = "USER_NAME";
    private static final String USER_LAST_NAME = "USER_LAST_NAME";
    //.... etc for all User members

    private static SharedPreferences getSharedPreferences(Context context) {
        return PreferenceManager.getDefaultSharedPreferences(context);
    }

    public static User getUser(Context context) {
        SharedPreferences sp = getSharedPreferences(context); 
        int id = sp.getInt(USER_ID, -1);
        String name = sp.getString(USER_NAME, null);
        String lastName = sp.getString(USER_LAST_NAME, null);
        // etc for all User members

        return new User(id, name, lastName, ....);
    }

    public static void setUser(Context context, User user) {
        if (user != null) {
            SharedPreferences.Editor() editor = getSharedPreferences(context).edit();
            editor.putInt(USER_ID, user.getId());
            editor.putString(USER_NAME, user.getName());
            editor.putString(USER_LAST_NAME, user.getLastName());
            ... (etc, for all user class members)

            editor.apply();
        }
    }

    // the remove method you could use, for example, if users logs out
    public static void removeUser(Context context) {
        SharedPreferences.Editor() editor = getSharedPreferences(context).edit();
        editor.remove(USER_ID);
        editor.remove(USER_NAME);
        // etc for all user members stored in SharedPreferences

        editor.apply();
    }
}

可以从应用程序中的任何活动调用此类方法。我相信这是存储和检索此类值的最安全方式。您只需在用户登录和注销时小心正确地删除和存储这些信息。

我希望这有帮助!如果您有任何其他问题,请随时补充(并请发布您的完整代码)。


推荐阅读