此文章发布于71
个月前,部分信息可能已经过时
,请自行斟酌确认。
提前说下 Session 过期时间是不发起请求持续一定时间后
session 过期,shiro 默认是 30 分钟。
shiro 设置 session 超时时间
Shiro 的 Session接口有一个 setTimeout() 方法,登录后,可以用如下方式取得 session
SecurityUtils.getSubject().getSession().setTimeout(1800000);
设置的最大时间,正负都可以,为负数时表示永不超时。
SecurityUtils.getSubject().getSession().setTimeout(-1000l);
注意:这里设置的时间单位是:ms,但是Shiro会把这个时间转成:s,而且是会舍掉小数部分,这样我设置的是-1ms,转成s后就是0s,马上就过期了。所有要是除以1000以后还是负数,必须设置小于-1000
自定义 SessionManager 时也可以这样设置
/**
* 自定义 sessionManager,可从请求头中获取 token 做为 sessionid 实现无状态请求
*/
@Bean
public SessionManager sessionManager(RedisSessionDAO redisSessionDAO) {
MyShiroSessionManager sessionManager = new MyShiroSessionManager();
sessionManager.setSessionDAO(redisSessionDAO);
sessionManager.setGlobalSessionTimeout(1000 * 60 * 60 * 24); //设置session过期时间毫秒,这里是1天
return sessionManager;
}
初次登录后指定时间过期
另外,微酷开启了 redis 缓存,需要注意的是每次请求时 redis 中的过期时间也会重置为 session 的超时时间。
但微酷期望的实现是:登录后即设置 session 为1天,不管访问还是不访问,1 天后 session 强制过期。
实现方法:
补充:此方法有问题不要再使用了。
RedisSessionDAO 中实现了 session 读写 redis 的逻辑,将 update 方法注释掉就可以实现 session 在写入后不更新,这样 redis 缓存 1 天过期 session 也会失效。
应该还有其它方法,没再深入研究。
/**
* 更新
*/
@Override
public void update(Session session) throws UnknownSessionException {
System.out.println("=======刷新session缓存,注释掉后将不再更新redis====="+session.getId());
this.redisTemplate.opsForValue().set(sessionKeyPrefix + session.getId(), session, sessionLive, TimeUnit.MINUTES);
}