Android 用户Session管理的设计方案

相信大家都知道,每一个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);
  }

一、设计

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

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

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开源:https://github.com/raee/retrofit-ext.git

总结

以上所述是小编给大家介绍的Android 用户Session管理的设计方案,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • android实现session保持简要概述及实现

    在最近写的一个Android中需要请求web服务器中的数据,有一个登录Activity,登录后会到MainActivity,这中间登录和MainActivity都需要请求php的jsonapi,所以要在网络请求中保持session的,研究了好半天才搞定.其实sesion在浏览器和web服务器直接是通过一个叫做name为sessionid的cookie来传递的,所以只要在每次数据请求时保持sessionid是同一个不变就可以用到web的session了,做法是第一次数据请求时就获取sessioni

  • android与asp.net服务端共享session的方法详解

    前言 最近因为工作的需要,要实现一个功能,就是需要通过发送短信进行注册,现在想把短信验证码放到服务器的session值中,当客户端收到短信并提交短信码时由asp.net服务端进行判断,那么如何共享这个session那么需要在android客户端中添加几行代码. 实现方法 如下操作.第一次数据请求时就获取这个cookie的名称并且得到这个cookie的值,这个即是sessionid的值并保存在一个静态变量中,然后在第二次请求数据的时候要将这个sessionid一并放在Cookie中发给服务器,服务

  • Android 用户Session管理的设计方案

    相信大家都知道,每一个App都需要登录,登录信息都保存在本地文件中,然后我们就写一堆的操作SharedPreferences的代码了. 现在,你可以完全抛弃这种方法,一句代码搞定登录信息,用户信息管理.实现全局操作.为你的程序解耦. public void sessionDemo() { // 获取登录信息 TokenInfo token = SessionManager.getDefault().getUserToken(); // 获取用户信息 UserInfo userInfo = Ses

  • oracle用户权限管理使用详解

    一.系统的默认用户 1)sys用户是超级用户,具有最高权限,具有sysdba角色,有create database的权限,该用户默认的密码是sys.登录语句:SQL> conn sys/sys as sysdba; 2)system用户是管理操作员,权限也很大.具有sysoper角色,没有create database的权限,默认的密码是manager.登录语句:SQL> conn system/manager; 3)sys和system这两个用户最大的区别是在于有没有create datab

  • 微信小程序 http请求的session管理

    微信小程序 http请求的session管理 作为一个开发JavaWeb应用的程序猿,都喜欢将用户登录后的用户信息(比如说用户id,用户名称)放入session中保存,之后在业务逻辑的开发中需要用到用户信息的时候就可以轻松又方便的从session中取到值.最近在开发微信小程序的时候碰到一个问题就是每次微信小程序请求的时候都会改变sessionid,这就会导致在后面的请求中取不到登录时保存在session中的用户信息,其实在前后端分离开发的时候也会碰到这个问题,后端程序员负责服务器端开发,提供接口

  • Crashlytics Android 异常报告统计管理(详解)

    简介 Crashlytic 成立于2011年,是专门为移动应用开者发提供的保存和分析应用崩溃信息的工具.Crashlytics的使用者包括:支付工具Paypal, 点评应用Yelp, 照片分享应用Path, 团购应用GroupOn等移动应用. 2013年1月,Crashlytics被Twitter收购,成为又一个成功的创业产品.被收购之后,由于没有了创业公司的不稳定因素,我们更有理由使用它来分析应用崩溃信息. 使用Crashlytics的好处有: 1.Crashlytics不会漏掉任何应用崩溃信

  • 深入浅析TomCat Session管理分析

    前言 对于广大java开发者而已,对于J2EE规范中的Session应该并不陌生,我们可以使用Session管理用户的会话信息,最常见的就是拿Session用来存放用户登录.身份.权限及状态等信息.对于使用Tomcat作为Web容器的大部分开发人员而言,Tomcat是如何实现Session标记用户和管理Session信息的呢? 概要 SESSION Tomcat内部定义了Session和HttpSession这两个会话相关的接口,其类继承体系如图1所示. 图1 Session类继承体系 图1中额

  • 浅谈Tomcat Session管理分析

    前言 在上文Nginx+Tomcat关于Session的管理中简单介绍了如何使用redis来集中管理session,本文首先将介绍默认的管理器是如何管理Session的生命周期的,然后在此基础上对Redis集中式管理Session进行分析. Tomcat Manager介绍 上文中在Tomcat的context.xml中配置了Session管理器RedisSessionManager,实现了通过redis来存储session的功能:Tomcat本身提供了多种Session管理器,如下类图: 1.

  • SpringBoot整合Shiro框架,实现用户权限管理

    一.Shiro简介 核心角色 1)Subject:认证主体 代表当前系统的使用者,就是用户,在Shiro的认证中,认证主体通常就是userName和passWord,或者其他用户相关的唯一标识. 2)SecurityManager:安全管理器 Shiro架构中最核心的组件,通过它可以协调其他组件完成用户认证和授权.实际上,SecurityManager就是Shiro框架的控制器. 3)Realm:域对象 定义了访问数据的方式,用来连接不同的数据源,如:关系数据库,配置文件等等. 核心理念 Shi

  • 详解android是如何管理内存的

    目录 前言 Java Heap 进程内存分配 内存不足管理 GC 垃圾回收 内核交换守护进程 低内存终止守护进程 最后 前言 很高兴遇见你~ 内存优化一直是 Android 开发中的一个非常重要的话题,他直接影响着我们 app 的性能表现.但这个话题涉及到的内容很广且都偏向底层,让很多开发者望而却步.同时,内存优化更加偏向于"经验知识",需要在实际项目中去应用来学习. 因而本文并不想深入到底层去讲内存优化的原理,而是着眼于宏观,聊聊 android 是如何分配和管理内存.在内存不足的时

  • Android音频焦点管理实例详解

    目录 音频焦点管理的意义 音频焦点管理的行为准则 版本兼容 在Android 8.0(API 26) 之前对音频焦点具体处理实现 8.0 之后实现 延迟获取焦点 自动降低音量 音频焦点请求方式 响应音频焦点更改 暂时性失去焦点 永久性失去焦点 附音频基础知识 总结 音频焦点管理的意义 两个或两个以上的 Android 应用可同时向同一输出流播放音频.系统会将所有音频流混合在一起.虽然这是一项出色的技术,但却会给用户带来很大的困扰.为了避免所有音乐应用同时播放,Android 引入了“音频焦点”的

  • Python Flask-Login实现用户会话管理

    Flask-Login 为 Flask 提供用户会话管理.它处理登录.注销和长时间记住用户会话等常见任务. Flask-Login 不绑定到任何特定的数据库系统或权限模型.唯一的要求是您的 用户对象实现一些方法,并且您向能够 从用户 ID 加载用户 的扩展提供回调. GitHub:https://github.com/maxcountryman/flask-login LoginManager 是一个类,有多个方法和属性:该类初始化的对象用于保存用于登录的设置.LoginManager 实例不绑

随机推荐