1. 程式人生 > >spring session實現不同專案之間session同步

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;

    }

}