`
云中之海
  • 浏览: 31478 次
  • 性别: 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>

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics