web使用shiro框架时,怎么设置 session 永不过期session.setTime(-1000)行不通

web使用shiro框架时,怎么设置 session 永不过期session.setTime(-1000)行不通,第1张

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反序列化异常解决等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9628825.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存