关于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>
相关推荐
3. **Shiro的集成**:研究如何在SpringBoot应用中配置Shiro,包括安全配置、 Realm(认证和授权信息提供者)的实现以及自定义注解的编写和使用。 4. **Shiro的权限控制**:掌握如何使用Shiro的注解进行权限判断,如@...
SpringMVC+Shiro自定义过滤器的实现代码 itle"springmvc+shiro自定义过滤器的实现代码"所涉及的知识点如下: 1. SpringMVC拦截器 在SpringMVC中,拦截器(Interceptor)是一种特殊的Bean,它可以在请求处理之前、...
- 配置文件:可能是 Shiro 的 `shiro.ini` 或者 Spring 配置文件,其中包含了 Realm 的配置信息。 总的来说,自定义 Realm 是 Shiro 集成到实际应用的关键步骤,它使我们能够根据业务需求灵活地管理用户的安全信息...
在"shiro管理多登录入口配置,手机端登录与网页端登录"这个场景下,我们需要考虑如何为不同的登录入口(手机端和网页端)设置独立的验证流程。 首先,Shiro 的核心组件 Realm 负责与应用数据源交互,验证用户身份。...
总结一下,解决Spring配置Shiro时自定义Realm中属性无法使用注解注入的问题,关键在于理解两个框架的生命周期,并调整配置文件确保Spring先于Shiro加载。这样做不仅解决了注解注入的问题,也使得整个应用的启动流程...
在本篇文章中,我们将详细介绍如何在 SpringBoot 项目中配置自定义密码加密器代码实例,使用 Shiro 框架来实现身份认证和授权管理。Shiro 框架提供了一个灵活的安全管理系统,可以满足各种应用场景的需求。 Shiro ...
3. ** 配置Shiro**:在Shiro的配置文件(如`shiro.ini`或Java配置类)中,将自定义的Realm添加到安全管理器中。记得为Realm指定一个唯一的ID,以便在其他配置中引用。 4. ** 集成自定义Realm**:在应用启动时,...
在这个示例中,我们将介绍如何将 Shiro 集成到 Spring Boot 项目中,并实现自定义密码验证和 Freemarker 标签根据权限渲染不同页面。 首先,需要在 pom.xml 文件中添加 Shiro 的依赖项: ```xml <groupId>org....
在本文中,我们将深入探讨Apache Shiro的基础配置和代码实现,以帮助你理解如何有效地使用Shiro进行权限控制。 **1. Shiro架构组件** Shiro的核心组件包括:Subject、Realms、Caches、Session Manager、...
在学习Shiro的过程中,理解如何配置和自定义Realm是非常关键的一步,因为这直接关系到你的应用如何与后端系统交互以实现安全控制。通过这个简单的测试项目,你可以深入理解Shiro的工作原理,为构建更复杂的安全架构...
如果你的应用使用 Spring,那么需要在 Spring 的配置文件中声明自定义 Filter,并将其添加到 Shiro 的 FilterChainResolver 中。 通过以上步骤,我们就实现了 Shiro 自定义处理 AJAX 请求的能力,能够在用户无权...
1. **配置Shiro**:在Spring或者其他的配置文件中,你需要声明并配置Shiro的相关过滤器,如`authc`(用于身份验证)、`perms`(基于权限的拦截)和`roles`(基于角色的拦截)。 2. **定义角色和权限**:在提供的`...
在Web应用的配置文件(如`shiro.ini`或Spring XML配置)中,我们需要注册刚刚创建的自定义Realm,并设置为默认的认证和授权 Realm。 ```ini [main] customRealm = com.example.CustomRealm securityManager.realms...
如果不自定义缓存,Shiro 默认会将会话信息存储在服务器内存中,这在多服务器环境可能会导致会话丢失。为了跨服务器共享会话,一般会使用分布式缓存(如 Redis 或 Memcached)来存储会话。 4. **缓存**(Caching)...
接着,配置Shiro的安全管理,定义 Realm 对象进行认证和授权,结合Ehcache实现缓存策略。最后,通过Spring的AOP支持,将Shiro的拦截器添加到Spring的全局拦截器链中,实现安全控制。 这样的整合可以创建一个健壮、...
在压缩包文件中,`make-Java-tld.fbr`可能是一个编译或构建自定义TLD标签库的工程文件,通常包含源代码、配置文件和编译脚本。这类文件可以帮助开发者理解如何创建和部署自定义标签库。要深入学习,你需要打开这个...
三个核心组件:Subject, SecurityManager 和 Realms. Subject:即"当前操作用户"。...也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
- **配置文件**:可能包含 Shiro 配置,如 realm 配置、安全设置等。 - **测试类**:可能包含 JUnit 测试用例,用于验证 Shiro 功能的正确性。 - **资源文件**:如用户、角色和权限的定义,可能存在于 XML 或数据库...
4. **自定义Realm**:根据实际业务需求,实现自定义的AuthenticationRealm,重写doGetAuthenticationInfo和doGetAuthorizationInfo方法,完成用户登录验证和权限校验。 5. **设置过滤器**:配置...
总的来说,Shiro 与 Spring 的整合涉及到多个配置文件,包括 `web.xml`、`springmvc.xml`、`spring-shiro-web.xml` 和 `applicationContext.xml`。通过这些配置,我们可以定制化 Shiro 的认证、授权规则,并利用 ...