关于shiro中sessionId的自定义重写,上篇文章有涉及
通过上次的引入,发现对spring注入机制反而有跟多的理解
所以直接动手撸起袖子开干。
一 需求
首先是我需要做什么,因为一个项目集成两个系统的原因,导致session相互污染,导致登陆或异常登陆session管理混乱。
查找资料其中有人遇到过类似的问题。
<!-- 会话Cookie模板 -->
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<constructor-arg value="sid"/>
**<!--设置Cookie名字,默认为JSESSIONID-->
<property name="name" value="WEBSID" />**
</bean>
2个web模块,分别设置不同的sessionIdCookie的name即可
他是这么解决的,是的两个sessionIdCookie name,但是我是一个项目,只有一个shiro没有两个配置供我使用。
解决思路:重写方法,定义我自己的逻辑对sessionIdCookie name赋值。
根据上面的代码我们可以看出,<propertyname="name"value="WEBSID" />
name属性是可以通过注入的方式进行修改的。
那么以此类推,我必然需要重写方法来改变这个值。
查看shiro配置文件,我们可以看到sessionIdCookie 被注入给了sessionManager
看来这就是我们需要操作的对象。
public class MySessionListener2 extends SessionListenerAdapter { @Override public void onStart(Session session) { System.out.println("会话创建:" + session.getId()); } }
这里是我看到张开涛大大文章里面,我也模仿着写了一个,具体不贴了
debug了一下,还真是session是创建后的session,那此时sessionIdCookie
一定还在生成过程中,这里做文章。
查看了DefaultWebSessionManager的源码,发现其中也有一个onStart的方法。
重写它是必然,其中发现了注入的对象
private Cookie sessionIdCookie; private boolean sessionIdCookieEnabled;
这不是就我想要的嘛。
于是重写方法:
import org.apache.shiro.session.Session; import org.apache.shiro.session.mgt.SessionContext; import org.apache.shiro.web.session.mgt.DefaultWebSessionManager; public class AngWebSessionManager extends DefaultWebSessionManager { @Override /** * 重写onStart方法,该方法在生成session时可调用 * 此时可对父类SessionIdCookie进行操作,更改其CookiseName的值 * 默认为JSESSIONID,可由配置注入单个统一名称 * 重写方法可实现多个名称,运用于不同系统拥有不同CookiseName * (未启用) * 使用方法替换注入DefaultWebSessionManager */ protected void onStart(Session session, SessionContext context) { String name = ""; if(!session.getId().toString().split("_")[0].equals("Hr") &&!session.getId().toString().split("_")[0].equals("Biz")){ name = "Agrant"; }else if(session.getId().toString().split("_")[0].equals("Hr")){ name = "Agrant_Hr"; }else if(session.getId().toString().split("_")[0].equals("Biz")){ name = "Agrant_biz"; } super.getSessionIdCookie().setName(name); super.onStart(session, context); } }
这里做了登入之前sessionid名字叫Agrant,不同系统登陆之后会有赋予不同的名字。
然后注入给shiro使用 over
<bean id="sessionManager" class="*****.AngWebSessionManager "> <!-- session的失效时长,单位毫秒 --> <property name="globalSessionTimeout" value="1800000"/> <!-- 删除失效的session --> <property name="deleteInvalidSessions" value="true"/> <property name="sessionFactory" ref="sessionFactory"/> <property name="sessionDAO" ref="sessionDAO"/> </bean>
相关推荐
SpringBoot 、Shiro、 自定义注解权限控制
从实例入手学习Shiro自定义Realm实现查询数据进行验证示例代码.zip
主要介绍了springmvc+shiro自定义过滤器的实现方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
shiro管理多登录入口配置,手机端登录与网页端登录两个的shiro配置,两个Realm,两个表单过滤,验证码生成,登录类型判断,xml详细配置
SpringMVC+Mybatis+Spring+Shiro+ehcache整合配置文件
主要介绍了SpringBoot Shiro配置自定义密码加密器代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
今天小编就为大家分享一篇关于Spring配置shiro时自定义Realm中属性无法使用注解注入的解决办法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
Apache shiro权限控制基础配置代码,比网上其它文章全面,细致,适用,经测试可行.
shiro权限框架自定义Realm示例
三个核心组件:Subject, SecurityManager 和 Realms. Subject:即"当前操作用户"。...也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
主要介绍了spring-boot 集成 shiro 自定义密码验证 自定义freemarker标签根据权限渲染不同页面,需要的朋友可以参考下
本demo为Spring boot整合shiro,以mybatis plus做dao层交互数据,实现了读取数据库用户数据实现用户登录,权限认证,读取数据库中用户对应的url请求,实现请求的过滤。自定义了relam和过滤器来实现这些功能
尚硅谷_Shiro_权限 URL 配置细节 · 07. 尚硅谷_Shiro_认证思路分析 · 08.尚硅谷_Shiro_实现认证流程 · 09.尚硅谷_Shiro_实现认证 Realm · 10.尚硅谷_Shiro_密码的比对 · 11.尚硅谷_Shiro_密码的MD5加密 ...
配置applicationContext-shiro.xml 1. 配置authorizingRealm <bean id="authorizingRealm" class="com.mjm.core.interceptor.ShiroRealm"> 2.Shiro Filter 设置拦截的内容和登录页面和成功、失败页面 3.配置...
这里是shiro在web应用中自定义Realm的代码,以便做一个参考
shiro-demo不自定义缓存,
观看视频,需要先安装视频软件才能观看,该视频软件换可以录视频,需要资源少,是个不错的视频软件
本文小编将基于 SpringBoot 集成 Shiro 实现动态uri权限,由前端vue在页面配置uri,Java后端动态刷新权
shiro自定义realm案例,参考文档:http://blog.csdn.net/qq_19558705/article/details/50775509
本系统演示: ssm 整合shiro 自定义shiro Realm 登录 授权拦截器 log4j 控制台打印sql