springsession使用redis共享session时,sessionid不一致的问题

本文解析了在使用SpringSession与Redis实现跨应用共享Session时遇到的问题,即SessionID不一致的原因,并提供了解决方案。问题在于各应用因context-path设置不同,导致生成的cookiePath各异,从而每次生成新的SessionID。通过自定义DefaultCookieSerializer并覆盖getCookiePath方法,将cookiePath统一为'/',解决了SessionID不一致的问题。

网上能找到很多帖子说怎么实现redis来共享session,照着做完,发现两个独立应用配置到同一个redis后,获取的session id不一样。
怎么回事,他们写的不是很简单,怎么我这每次都不一样呢。

找了半天,原来springsession 使用cookie传递session id,每个cookie的path不一致。 springsession默认使用DefaultCookieSerializer 来序列化cookie信息,默认的获取cookiepath的方法如下:

private String getCookiePath(HttpServletRequest request) {
	if (this.cookiePath == null) {
		return request.getContextPath() + "/";
	}
	return this.cookiePath;
}

由于我设置了应用的server.context-path=app1,不是默认的/,导致每个应用获取的cookiePath是不一样的。所以每次都生成了新的session id。

解决方法:
定制一个自己的DefaultCookieSerializer ,可以复制这个类,改个类名SpecialCookieSerializer(原类依赖的几个工具类自己也复制一份改改),然后重写getCookiePath方法,

private String getCookiePath(HttpServletRequest request) {
    if (this.cookiePath == null) {           
        return "/";
    }
    return this.cookiePath;
}

然后在配置类中配置:

 @Bean
 public CookieHttpSessionStrategy cookieHttpSessionStrategy() {
     CookieHttpSessionStrategy strategy = new CookieHttpSessionStrategy();
     strategy.setCookieSerializer(new SpecialCookieSerializer());
     return strategy;
 }

重启每个应用,再试试就行了。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值