如何创建一个APPS后台服务(三)去session化

可能是原因为用户体验的原因,基本上所有的APP应用都没有用session了,确实在手机这么小的键盘上,每次都要输入复杂层度为中的密码是很痛苦的,接下来为大家介绍一个去Session化的简单实现。

 

分以下步骤:

 1、用户登录后生成一授权token

// 生成token
String accessToken = ComUtils.getUUId();
String accessTime = DateUtil.getDate();
rUser.setAccesTime(accessTime);
rUser.setAccesToken(accessToken);

这里key的生成方式我们用JAVA的uuid

    2、 将KEY保存到数据库并与用户表建立映射

//更新到数据库
meDao.updateToken(accessToken, accessTime, rUser.getUserId());

直接将数据更新用户表建立映射,accessTime主要记录token的有效时间

 

 3、将token与用户信息数据缓存到内存

 用户信息的使用频率还是挺高的,作为有经验的程序肯定不会每次用的时候都去数据库查询一遍,这里我们用单列模式对数据做个缓存:

private static UserCach userCach = null;

private Map<String, User> map = new HashMap<String, User>();

private UserCach() {
}

public static synchronized UserCach getSignleton() {

    if (userCach == null) {
        userCach = new UserCach();
        userCach.init();

    }
    return userCach;
}

/**
     * 从数据库一次性初始化
   */
   private synchronized void init() {

    MeDao meDao = new MeDao();

    try {
        List<User> list = meDao.getAllUser();

        for (User user : list) {
            if (user.getAccesToken() != null & !"".equals(user.getAccesToken().trim())) {
                user.setTerminals(meDao.queryUserTerminal(user.getUserId()));

                map.put(user.getAccesToken(), user);
            }
        }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

public synchronized User getUser(String accesToken) {
    return map.get(accesToken);
}

 

    4、 使用拦截器检查token是否合法

    依据请求用户的token检查是否有效以及是否在访问期限内

private boolean check(String accesToken) {
 User user = UserCach.getSignleton().getUser(accesToken);
  if (user != null &&      
// 检查token是否失效
 DateUtil.addAndSubtractDaysByCalendar(user.getAccesTime(),  CommonConst.ACCES_DAYS).compareTo(DateUtil.getDate()) > 0) 
 {
   return true;
 } else
   return false;

}

好啦,简单的去session功能就实现,有问题欢迎在微信公众号留言,嘻嘻虽然还没有粉丝,为自己加油

 
 
 

如何创建一个APPS后台服务(三)去session化

上一篇:利用HTML和CSS设计一个静态的“小米商城官网首页”


下一篇:Android第二次作业