`
云中之海
  • 浏览: 31847 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

shiro 自定义多sessionIdCookie 配置 重写

 
阅读更多

关于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、 自定义注解权限控制源码下载

    3. **Shiro的集成**:研究如何在SpringBoot应用中配置Shiro,包括安全配置、 Realm(认证和授权信息提供者)的实现以及自定义注解的编写和使用。 4. **Shiro的权限控制**:掌握如何使用Shiro的注解进行权限判断,如@...

    springmvc+shiro自定义过滤器的实现代码

    SpringMVC+Shiro自定义过滤器的实现代码 itle"springmvc+shiro自定义过滤器的实现代码"所涉及的知识点如下: 1. SpringMVC拦截器 在SpringMVC中,拦截器(Interceptor)是一种特殊的Bean,它可以在请求处理之前、...

    从实例入手学习Shiro自定义Realm实现查询数据进行验证示例代码.zip

    - 配置文件:可能是 Shiro 的 `shiro.ini` 或者 Spring 配置文件,其中包含了 Realm 的配置信息。 总的来说,自定义 Realm 是 Shiro 集成到实际应用的关键步骤,它使我们能够根据业务需求灵活地管理用户的安全信息...

    shiro管理多登录入口配置,手机端登录与网页端登录

    在"shiro管理多登录入口配置,手机端登录与网页端登录"这个场景下,我们需要考虑如何为不同的登录入口(手机端和网页端)设置独立的验证流程。 首先,Shiro 的核心组件 Realm 负责与应用数据源交互,验证用户身份。...

    Spring配置shiro时自定义Realm中属性无法使用注解注入的解决办法

    总结一下,解决Spring配置Shiro时自定义Realm中属性无法使用注解注入的问题,关键在于理解两个框架的生命周期,并调整配置文件确保Spring先于Shiro加载。这样做不仅解决了注解注入的问题,也使得整个应用的启动流程...

    SpringBoot Shiro配置自定义密码加密器代码实例

    在本篇文章中,我们将详细介绍如何在 SpringBoot 项目中配置自定义密码加密器代码实例,使用 Shiro 框架来实现身份认证和授权管理。Shiro 框架提供了一个灵活的安全管理系统,可以满足各种应用场景的需求。 Shiro ...

    shiro权限框架自定义Realm示例

    3. ** 配置Shiro**:在Shiro的配置文件(如`shiro.ini`或Java配置类)中,将自定义的Realm添加到安全管理器中。记得为Realm指定一个唯一的ID,以便在其他配置中引用。 4. ** 集成自定义Realm**:在应用启动时,...

    spring boot 集成 shiro 自定义密码验证 自定义freemarker标签根据权限渲染不同页面(推荐

    在这个示例中,我们将介绍如何将 Shiro 集成到 Spring Boot 项目中,并实现自定义密码验证和 Freemarker 标签根据权限渲染不同页面。 首先,需要在 pom.xml 文件中添加 Shiro 的依赖项: ```xml &lt;groupId&gt;org....

    Apache shiro权限控制基础配置代码

    在本文中,我们将深入探讨Apache Shiro的基础配置和代码实现,以帮助你理解如何有效地使用Shiro进行权限控制。 **1. Shiro架构组件** Shiro的核心组件包括:Subject、Realms、Caches、Session Manager、...

    用于测试shiro中自定义Realm的测试代码

    在学习Shiro的过程中,理解如何配置和自定义Realm是非常关键的一步,因为这直接关系到你的应用如何与后端系统交互以实现安全控制。通过这个简单的测试项目,你可以深入理解Shiro的工作原理,为构建更复杂的安全架构...

    自定义shiro实现识别ajax请求的拒绝返回json,还是普通返回页面

    如果你的应用使用 Spring,那么需要在 Spring 的配置文件中声明自定义 Filter,并将其添加到 Shiro 的 FilterChainResolver 中。 通过以上步骤,我们就实现了 Shiro 自定义处理 AJAX 请求的能力,能够在用户无权...

    基于Shiro 拦截URL,实现权限控制

    1. **配置Shiro**:在Spring或者其他的配置文件中,你需要声明并配置Shiro的相关过滤器,如`authc`(用于身份验证)、`perms`(基于权限的拦截)和`roles`(基于角色的拦截)。 2. **定义角色和权限**:在提供的`...

    shiro web中自定义Realm

    在Web应用的配置文件(如`shiro.ini`或Spring XML配置)中,我们需要注册刚刚创建的自定义Realm,并设置为默认的认证和授权 Realm。 ```ini [main] customRealm = com.example.CustomRealm securityManager.realms...

    shiro-demo不自定义缓存.zip

    如果不自定义缓存,Shiro 默认会将会话信息存储在服务器内存中,这在多服务器环境可能会导致会话丢失。为了跨服务器共享会话,一般会使用分布式缓存(如 Redis 或 Memcached)来存储会话。 4. **缓存**(Caching)...

    SpringMVC+Mybatis+Spring+Shiro+ehcache整合配置文件

    接着,配置Shiro的安全管理,定义 Realm 对象进行认证和授权,结合Ehcache实现缓存策略。最后,通过Spring的AOP支持,将Shiro的拦截器添加到Spring的全局拦截器链中,实现安全控制。 这样的整合可以创建一个健壮、...

    自定义tld标签库源码加视频

    在压缩包文件中,`make-Java-tld.fbr`可能是一个编译或构建自定义TLD标签库的工程文件,通常包含源代码、配置文件和编译脚本。这类文件可以帮助开发者理解如何创建和部署自定义标签库。要深入学习,你需要打开这个...

    Shiro原理+配置

    三个核心组件:Subject, SecurityManager 和 Realms. Subject:即"当前操作用户"。...也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。

    shiro demo 例子

    - **配置文件**:可能包含 Shiro 配置,如 realm 配置、安全设置等。 - **测试类**:可能包含 JUnit 测试用例,用于验证 Shiro 功能的正确性。 - **资源文件**:如用户、角色和权限的定义,可能存在于 XML 或数据库...

    springboot+shiro+redis整合

    4. **自定义Realm**:根据实际业务需求,实现自定义的AuthenticationRealm,重写doGetAuthenticationInfo和doGetAuthorizationInfo方法,完成用户登录验证和权限校验。 5. **设置过滤器**:配置...

    shiro 配置文件

    总的来说,Shiro 与 Spring 的整合涉及到多个配置文件,包括 `web.xml`、`springmvc.xml`、`spring-shiro-web.xml` 和 `applicationContext.xml`。通过这些配置,我们可以定制化 Shiro 的认证、授权规则,并利用 ...

Global site tag (gtag.js) - Google Analytics