Android 如何设计用户Session管理?

栏目: Android · 发布时间: 5年前

内容简介:相信大家都知道,每一个App都需要登录,登录信息都保存在本地文件中,然后我们就写一堆的操作SharedPreferences的代码了。现在,你可以完全抛弃这种方法,一句代码搞定登录信息,用户信息管理。实现全局操作。为你的程序解耦。引用库:

相信大家都知道,每一个App都需要登录,登录信息都保存在本地文件中,然后我们就写一堆的操作SharedPreferences的代码了。

现在,你可以完全抛弃这种方法,一句代码搞定登录信息,用户信息管理。实现全局操作。为你的程序解耦。

public void sessionDemo() {

        // 获取登录信息
        TokenInfo token = SessionManager.getDefault().getUserToken();
        // 获取用户信息
        UserInfo userInfo = SessionManager.getDefault().getUser();
        // 是否登录
        boolean isLogin = SessionManager.getDefault().isLogin();
        // 退出登录
        SessionManager.getDefault().clear();

        // 登录成功后,设置用户信息
        SessionManager.getDefault().setUser(new UserInfo());
        // 登录成功后,设置登录信息
        SessionManager.getDefault().setUserToken(new TokenInfo());

        // 这句请在Application onCreate 的时候调用初始化配置信息
        SessionManager.initWithConfig(
                new SessionManager.ConfigBuilder()
                        .context(this)
                        .tokenClass(TokenInfo.class)
                        .userClass(UserInfo.class)
                        .build());

        Log.i("rae", "登录信息:" + token);
        Log.i("rae", "用户信息:" + userInfo);
        Log.i("rae", "是否登录:" + isLogin);
    }
复制代码

引用库:

compile 'com.rae.swift:rae-library:1.0.1'
复制代码

如果下载失败,请在 根目录 build.gradle 添加:

allprojects {
    repositories {
        maven { url "https://dl.bintray.com/raee/Android" }
    }
}
复制代码

一、设计

抽象工厂模式,整体UML如下图,整体思路为:

抽象出SessionManager类,实际还是PreferencesSessionManager实现了这个抽象类,进行本地SharePreferences保存。

Android 如何设计用户Session管理?

**Config:**负责维护实体类的class,用来做JSON序列化保存到本地的。这个类起到泛型解析的作用,getUser()返回的对象就由这个类去维护了。从而达到了解耦的作用。

**ConfigBuild:**构建者模式,提供方便的会话配置。

SessionManager.getDefault(); 默认返回的是PreferencesSessionManager的实例。

二、自定义SessionManger

如果不想用SharePreferences来保存用户信息,也可以继承SessionManger类实现抽象方法实现自定义的Session管理。

如果你的自定义也想全局访问,那么可以新增一个AppSessionManger的类,来实现一个单例方法,返回你自定义的实现。

参考SessionManger.getDefault()的实现就可以了。

三、 SessionManger 代码实现

/**
 * 会话管理
 * Created by ChenRui on 2017/4/28 0028 17:27.
 */
public abstract class SessionManager {

    public static class Config {
        Class<?> userTokenClass;
        Class<?> userClass;
        Context context;
    }

    public static class ConfigBuilder {
        private final Config mConfig;

        public ConfigBuilder() {
            mConfig = new Config();
        }

        public ConfigBuilder tokenClass(Class<?> cls) {
            mConfig.userTokenClass = cls;
            return this;
        }

        public ConfigBuilder userClass(Class<?> cls) {
            mConfig.userClass = cls;
            return this;
        }

        public ConfigBuilder context(Context applicationContext) {
            mConfig.context = applicationContext;
            return this;
        }

        public Config build() {
            return mConfig;
        }
    }

    private static Config sConfig;
    private static WeakReference<SessionManager> managerWeakReference;

    /**
     * 获取默认的会话管理器,默认的为cookie 管理器。
     * 使用之前请使用{@link #initWithConfig(Config)} 来进行初始化配置。
     */
    public static SessionManager getDefault() {
        if (sConfig == null) {
            Log.w("SessionManager", "session config from default");
            sConfig = new ConfigBuilder().tokenClass(SessionToken.class).userClass(SessionUserInfo.class).build();
        }

        if (managerWeakReference == null || managerWeakReference.get() == null) {
            synchronized (SessionManager.class) {
                if (managerWeakReference == null || managerWeakReference.get() == null) {
                    managerWeakReference = new WeakReference<SessionManager>(new PreferencesSessionManager(sConfig));
                }
            }
        }

        return managerWeakReference.get();
    }

    /**
     * 初始化会话管理器
     */
    public static void initWithConfig(Config config) {
        if (sConfig != null) {
            sConfig = null;
            System.gc();
        }

        sConfig = config;
    }


    SessionManager() {
    }

    /**
     * 是否登录
     */
    public abstract boolean isLogin();


    /**
     * 清除会话信息,即退出登录。
     */
    public abstract void clear();

    /**
     * 获取当前登录的用户信息,在调用该方法之前请先调用{@link #isLogin()}来判断是否登录
     */
    public abstract <T> T getUser();

    /**
     * 设置当前用户信息
     */
    public abstract <T> void setUser(T user);

    /**
     * 设置用户授权信息
     *
     * @param token 授权信息
     */
    public abstract <T> void setUserToken(T token);

    /**
     * 获取用户授权信息
     */
    public abstract <T> T getUserToken();


}
复制代码

本文结束,非常简单的实现,但是却非常实用!

开源: github.com/raee/Androi…


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

推荐系统

推荐系统

[奥地利] Dietmar Jannach、Markus Zanker、Alexander Felfernig、Gerhard Friedrich / 蒋 凡 / 人民邮电出版社 / 2013-6-25 / 59.00元

编辑推荐: 通过对本书的学习,读者不仅可以全面系统地了解该领域的基础原理,还能试验如何搭建一套真正的推荐系统。 —— 百度主任架构师、百度技术委员会主席 廖若雪 本书比较全面地介绍了推荐系统涉及的相关知识点,很适合对于推荐系统感兴趣的相关人员作为入门教程,目前能够系统全面介绍相关技术的中文书籍还显得匮乏,相信这本译著对于缓解这种情况大有裨益。 ——新浪微博数据挖掘技术专家 ......一起来看看 《推荐系统》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具