spring session用作session共享的场景,比如我们商城里有个session,但是砍价、bbs,都是另外的项目,这时候,需要同一个用户,拥有相同的session。
很多人应该都知道,把session存在云端,比如redis。
OK,网上spring session+redis的文章很多,并且也比较简单的。
比如,springboot框架的话,这篇文章就行 http://blog.csdn.net/xiaoyu411502/article/details/48603597。
普通spring的话,那就这篇 http://www.cnblogs.com/beyang/p/6104802.html。
两种我都亲自测过可以。
好了,你们应该都搞定了吧。
这个工程里,
session.setAttribute("name", "scw");
那个工程里,就能够,
session.getAttribute("name").toString() 取到scw这个大侠的名字。
但我发现一个问题。
假如,两个项目,都是以xxxx.xx:8080/,或者xxxx.xx:8099/ 这种结尾的,那ok,可以同步
but,如果有项目,地址是xxxx.xx:8080/abcd/ ,就是说,路径中带上工程名的,sorry,同步不了啊。
我起先没有想到是这个path的问题,所以发现,为啥有些系统间能同步,有些不行,还以为拦截器问题。
后面发现是因为cookiePath的问题,所以,自己写了一个
class CustomerCookiesSerializer implements CookieSerializer{
然后,重写getCookiePath。
private String getCookiePath(HttpServletRequest request) {
if (this.cookiePath == null) {
return "/";
}
return this.cookiePath;
}
把项目的path都搞成一样。
然后,@EnableRedisHttpSession的那个类里,加个cookieHttpSessionStrategy的bean
@Configuration
@EnableRedisHttpSession
public class RedisSessionConfig {
@Bean
public JedisConnectionFactory connectionFactory() {
return new JedisConnectionFactory();
}
@Bean
public CookieHttpSessionStrategy cookieHttpSessionStrategy() {
CookieHttpSessionStrategy strategy = new CookieHttpSessionStrategy();
strategy.setCookieSerializer(new CustomerCookiesSerializer());
return strategy;
}
}