shiro 自定义多sessionIdCookie 配置 重写

关于shiro中sessionId的自定义重写,上篇文章有涉及

通过上次的引入,发现对spring注入机制反而有跟多的理解

所以直接动手撸起袖子开干。

 

一 需求

首先是我需要做什么,因为一个项目集成两个系统的原因,导致session相互污染,导致登陆或异常登陆session管理混乱。

查找资料其中有人遇到过类似的问题。

    
    <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
        <constructor-arg value="sid"/>
        **
        <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


  
     
      
     
      
       
   

 

 

你可能感兴趣的:(shiro)