可能是原因为用户体验的原因,基本上所有的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功能就实现,有问题欢迎在微信公众号留言,嘻嘻虽然还没有粉丝,为自己加油