我的shiro之旅 六 自定义shiro的sessionId

博客已移至 http://blog.gogl.top

shiro有自己的sesison概念,shiro的session并不是java ee的session。通常,我们看到shiro的sessionId格式类似c6395bbc-425d-43b3-a444-04fee5a92e95,是因为shiro产生sesisonId是通过UUID生成的。我们可以看到shiro-core-xx.jar的org.apache.shiro.session.mgt.eis包下有个JavaUuidSessionIdGenerator,shiro的sessionId默认是通过该类生成的。可以看看源码。

public class JavaUuidSessionIdGenerator implements SessionIdGenerator {

    /**
     * Ignores the method argument and simply returns
     * {@code UUID}.{@link java.util.UUID#randomUUID() randomUUID()}.{@code toString()}.
     *
     * @param session the {@link Session} instance to which the ID will be applied.
     * @return the String value of the JDK's next {@link UUID#randomUUID() randomUUID()}.
     */
    public Serializable generateId(Session session) {
        return UUID.randomUUID().toString();
    }
}

是通过调用java的UUID来生成一个唯一的ID。

我们可以自定义类,重写generateId方法,然后把它注入到shiro中。我们可以拿java ee的sessionId作为shiro的sessionId返回。不过我们可以看到generateId方法的参数是Session,这个Session是shiro自定义的,通过它无法拿到java ee的sessionId。我的做法是,写一个拦截器,当讲求过来时,拿到sessionId放到当前线程里,需要的时候从当前线程里拿。类也很简单,代码如下:

/**
 * @author Dylan
 */
public final class HttpSessionIdHolder {

	private HttpSessionIdHolder(){}
	
	private final static ThreadLocal<String> SESSIONID = new ThreadLocal<String>();
	
	/**
	 * @return
	 */
	public static String getSessionId(){
		return SESSIONID.get();
	}
	
	/**
	 * @param request
	 */
	public static void setSessionId(String SessionId){
		SESSIONID.set(SessionId);
	}
	
	/**
	 * 
	 */
	public static void removeSessionId(){
		SESSIONID.remove();
	}

}

我们在拦截器里从request拿到sessionId,然后调用setSessionId方法把sessionId保存到当前线程中,需要的时候调用getSessionId就可以得到。

当然,也可以用其他方法。

那么,怎么注入给shiro替换默认的sessionId产生方式呢。在securityManager有个sessionManager属性,在sessionManager有个sessionDAO属性,在sessionDAO有个sessionIdGenerator只要替换就行。如

	<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
		<property name="sessionManager" ref="sessionManager"/>
	</bean>
	<bean id="sessionDAO" class="com.neting.security.infrastructure.shiro.cache.CustomShiroSessionDao">
		<property name="sessionIdGenerator" ref="sessionIdGenerator"/>
	</bean>
	<bean id="sessionIdGenerator" class="com.neting.security.infrastructure.shiro.ShiroSessionIdGenerator"/>
	<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
		<property name="sessionDAO" ref="sessionDAO"/>
	</bean>

更简单的方式,在我的shiro之旅: 十 自定义shiro的SessionIdCookie这篇文章有介绍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值