Sets the time in milliseconds that the session may remain idle before expiring。
A negative value means the session will never expire
you need sets A negative value is long
sessionsetTimeout(-1000l);
之前群里有人报这个错,你这样排查一下,你用instanceof
判断下对象,另外你把序列化的id改一下,重启项目,当然你也要排查是不是有把实体打成jar包,多个类,然后序列化id不一样!
推荐一套完整的Shiro Demo,免费的。
Shiro介绍文档:>
背景
在本地session移至redis存储时,原本以为引入spring-session-data-redis依赖,配置Redis>
采用这个解决方案的前提是,你必须自己先实现一个realm,不过这个我相信大家都会实现的,毕竟默认的不是jdbcRealm ,真正的项目都是要查数据库才能确定用户是否登录的。那么我就假定大家的项目中都有那么一个负责验证登录的 JdbcRealm, 并且是采用用户名密码认证的,在 doGetAuthenticationInfo 方法里面是采用如下的方法来做认证
info = new SimpleAuthenticationInfo(username, passwordtoCharArray(), getName());
这个前提条件保证你的principal是username,相信大部分人根据教程做shiro的时候都采用了这种方式
STEP1 复写 FormAuthenticationFilter 的 isAccessAllowed 方法
做一个新类继承FormAuthenticationFilter ,并复写 isAccessAllowed 方法
package comyqrjxcshiro;
import javaxannotationResource;
import javaxservletServletRequest;
import javaxservletServletResponse;
import orgapacheshirosessionSession;
import orgapacheshirosubjectSubject;
import orgapacheshirowebfilterauthcFormAuthenticationFilter;
import comyqrjxcserviceglobalGlobalUserService;
public class RememberAuthenticationFilter extends FormAuthenticationFilter {
@Resource(name="globalUserService")
private GlobalUserService globalUserService;
/
这个方法决定了是否能让用户登录
/
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
Subject subject = getSubject(request, response);
//如果 isAuthenticated 为 false 证明不是登录过的,同时 isRememberd 为true 证明是没登陆直接通过记住我功能进来的
if(!subjectisAuthenticated() && subjectisRemembered()){
//获取session看看是不是空的
Session session = subjectgetSession(true);
//随便拿session的一个属性来看session当前是否是空的,我用userId,你们的项目可以自行发挥
if(sessiongetAttribute("userId") == null){
//如果是空的才初始化,否则每次都要初始化,项目得慢死
//这边根据前面的前提假设,拿到的是username
String username = subjectgetPrincipal()toString();
//在这个方法里面做初始化用户上下文的事情,比如通过查询数据库来设置session值,你们自己发挥
globalUserServiceinitUserContext(username, subject);
}
}
//这个方法本来只返回 subjectisAuthenticated() 现在我们加上 subjectisRemembered() 让它同时也兼容remember这种情况
return subjectisAuthenticated() || subjectisRemembered();
}
}
STEP2 设置使用这个新的 AuthenticationFilter (认证过滤器)
如果你用的是spring那么
<!-- 整合了rememberMe功能的filter -->
<bean id="rememberAuthFilter" class="comyqrjxcshiroRememberAuthenticationFilter" ></bean>
<!--将之前的 / = authc 替换成 rememberAuthFilter
/ = rememberAuthFilter
如果你用的是 ini 文件,那么
rememberAuthFilter=comyqrjxcshiroRememberAuthenticationFilter
#将之前的 / = authc 替换成 rememberAuthFilter
/ = rememberAuthFilter
然后重启项目我们来测试一下,先登录一次系统,然后直接关掉浏览器,然后打开浏览器直接输入系统某个页面的地址,发现可以直接进去了,session什么的也设置好了
大家好,一直以来我都本着用最通俗的话理解核心的知识点, 我认为所有的难点都离不开 「基础知识」 的铺垫。目前正在出一个 SpringBoot 长期系列教程,从入门到进阶, 篇幅会较多~
「大佬可以绕过 ~」
如果你是一路看过来的,很高兴你能够耐心看完。之前带大家学了 Springboot 基础部分,对基本的使用有了初步的认识, 接下来的几期内容将会带大家进阶使用,会先讲解基础 中间件 的使用和一些场景的应用,或许这些技术你听说过,没看过也没关系,我会带大家一步一步的入门,耐心看完你一定会有 收获 ~
上期带大家学习了 Shiro 中如何进行权限认证,本期将带大家学习 Shiro 中如何进行 缓存和会话管理 ,最后我们将做一个在线用户管理以及强制下线用户的功能,同样的,我们集成到 Springboot 中。
首先我们要明白使用缓存的原因,为啥要用它 还记得之前带大家实现的 用户认证 和 权限认证 吗,那里我使用了 MockUser ,真实场景中是要去数据查询的,这样一来就会产生耗时,请求多的时候数据库肯定忙不过来了,所以我们需要使用缓存来提高程序响应速度
缓存使用 Redis ,下面就带大家整一下:
修改 ShiroConfig ,添加方法
这样就可以了,大家可以把测试获取用户的地方改成数据库获取,看下 控制台 sql日志会明显减少,因为有一部分是从缓存拿的
这部分功能还是比较好玩的,学完可以自由发挥做一个房间功能,可以加入可以踢人,下面我们就开整
修改 ShiroConfig ,添加方法,因为我们使用的是 Redis 缓存
实现 SessionListener
最后同样的,想要开启需要我们注入到 Manager 中:
我们先定义一个类,用来记录在线用户:
那么怎么获取呢?我们定义一个方法,大家实践中可以抽到 Service 层,这里方便演示,我直接写到控制器里
如果你看谁不爽,可以直接让他下线,hhh~
是不是很简单,这里就不演示了,大家自行试试
本期内容就到这里结束了,总结一下,本节主要讲了 Shiro 如何进行缓存以及如何进行用户会话管理,大家可以举一反三,做一些小功能尝试尝试
下期给大家讲讲 Shiro 中如何整合 JWT ,这个大家应该不陌生,如果不知道啥是 JWT 也没关系,我会带大家一步一步入门,下期也是 Shiro 系列的终极篇,内容可能有点多,耐心看完哦。欢迎加群一起学习交流 ~
多个帐号在一个域下 *** 作起来不管是什么项目都有困难,因为我们在浏览器域名下的作用域是相同的,然后Cookie的Key是一样的。而我们的请求只能基于Cookie,登录了A,写入了Cookie,登录了B,B把A的记录就覆盖了。如果我们要多个帐号同时在线,那么就不要依赖Session,直接带令牌走。
推荐一套完整的Shiro Demo,免费的。
Shiro介绍文档:,管理员帐号:admin,密码:sojsoncom 如果密码错误,请用sojson。
PS:你可以注册自己的帐号,然后用管理员赋权限给你自己的帐号,但是,每20分钟会把数据初始化一次。建议自己下载源码,让Demo跑起来,然后跑的更快。
以上就是关于web使用shiro框架时,怎么设置 session 永不过期session.setTime(-1000)行不通全部的内容,包括:web使用shiro框架时,怎么设置 session 永不过期session.setTime(-1000)行不通、shiro中User user = (User) SecurityUtils.getSubject().getPrincipal();、shiro的session信息放redis反序列化异常解决等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)