spring session實現不同專案之間session同步
spring session用作session共享的場景,比如我們商城裡有個session,但是砍價、bbs,都是另外的專案,這時候,需要同一個使用者,擁有相同的session。
很多人應該都知道,把session存在雲端,比如redis。
OK,網上spring session+redis的文章很多,並且也比較簡單的。
兩種我都親自測過可以。
好了,你們應該都搞定了吧。
這個工程裡,
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;
}
}