Shiro 自定义 Session 过期超时时间+登录后指定时间强制 session 过期

此文章发布于 61 个月前,部分信息可能已经过时,请自行斟酌确认。

提前说下 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);
}
最后修改:2019 年 04 月 16 日 03 : 49 PM
如果觉得我的文章对你有用,请随意赞赏

发表评论