网上能找到很多帖子说怎么实现redis来共享session,照着做完,发现两个独立应用配置到同一个redis后,获取的session id不一样。
怎么回事,他们写的不是很简单,怎么我这每次都不一样呢。
找了半天,原来springsession 使用cookie传递session id,每个cookie的path不一致。 springsession默认使用DefaultCookieSerializer 来序列化cookie信息,默认的获取cookiepath的方法如下:
private String getCookiePath(HttpServletRequest request) {
if ( == null) {
return () + "/";
}
return ;
}
由于我设置了应用的-path=app1,不是默认的/,导致每个应用获取的cookiePath是不一样的。所以每次都生成了新的session id。
解决方法:
定制一个自己的DefaultCookieSerializer ,可以复制这个类,改个类名SpecialCookieSerializer(原类依赖的几个工具类自己也复制一份改改),然后重写getCookiePath方法,
private String getCookiePath(HttpServletRequest request) {
if ( == null) {
return "/";
}
return ;
}
然后在配置类中配置:
@Bean
public CookieHttpSessionStrategy cookieHttpSessionStrategy() {
CookieHttpSessionStrategy strategy = new CookieHttpSessionStrategy();
(new SpecialCookieSerializer());
return strategy;
}
重启每个应用,再试试就行了。