現狀
項目在使用Spring Cloud搭建微服務框架,其中分佈式session採用spring session+redis 模式html
需求
但願能夠在配置文件(application.yml)裏設置應用的cookiename、session超時時間以及redis存儲的namespaceredis
目前已知能夠經過下面的方式設置session超時時間和redis存儲session的namespace。spring
1.@EnableRedisHttpSession(maxInactiveIntervalInSeconds=3600,redisNamespace="xxx")--硬編碼,本身未測試瀏覽器
2.使用vm參數-Dspring.session.redis.namespace=xxx來設置redis的nameapce --已測試能夠生效cookie
但這都不是咱們想要的效果。。咱們但願能夠在配置文件裏設置這些參數。session
設計的配置文件的相關參數以下app
app: product: session: redisnamespace: ${app.product.name} #存儲分佈式session時redis的命名空間 timeout: 60 #session超時時間,單位:分鐘。 cookiename: ${app.product.name}SESSION #注意每一個不一樣的應用此cookiename應該不相同
其中框架
app.product.cookiename的值是但願設置的cookiename
app.product.session.timeout是但願設置的session超時時間
app.product.session.redisnamespace是但願設置的redis存儲session的namespace
解決方案
在一個@Configuration類裏分佈式
1.使用@Bean方式定義CookieHttpSessionStrategy 對象來解決cookiename的設置問題微服務
2.經過@PostConstruct 方式修改RedisOperationsSessionRepository對象的session超時時間、namespace
具體代碼以下:
設置cookiename
默認的cookiename是SESSION,不一樣的應用通常要求cookiename不相同,因此須要修改。。修改的方式可參考下文:
//從配置裏讀取cookiename,若是沒有配置,則使用默認的DEFAULTSESSION @Value("${app.product.cookiename:DEFAULTSESSION}") String cookieName; @Bean public CookieHttpSessionStrategy cookieHttpSessionStrategy(){ CookieHttpSessionStrategy strategy=new CookieHttpSessionStrategy(); DefaultCookieSerializer cookieSerializer=new DefaultCookieSerializer(); cookieSerializer.setCookieName(cookieName);//cookies名稱 strategy.setCookieSerializer(cookieSerializer); return strategy; }
設置session超時時間(默認的超時時間是30分鐘)、redis存放的namespace
具體見下文:經過@PostConstruct 方式修改RedisOperationsSessionRepository對象的屬性
/** * 從配置的yml文件裏取設置session超時時間,單位是分鐘 * 若是沒配置,則默認30分鐘,即1800s */ @Value("${app.product.session.timeout:30}") int sessionTimeoutInMinuts; /** * 從配置的yml文件裏取設置session存儲到redis時對應的namespace */ @Value("${app.product.session.redisnamespace:}") String redisnamespace; @Autowired private RedisOperationsSessionRepository sessionRepository; @PostConstruct private void afterPropertiesSet() { log.info("setting sesion 超時時間 = [{}]分鐘",sessionTimeoutInMinuts); sessionRepository.setDefaultMaxInactiveInterval(sessionTimeoutInMinuts * 60); log.info("setting sesion 存儲到redis時的namespace = [{}]",redisnamespace); sessionRepository.setRedisKeyNamespace(redisnamespace); }
測試代碼以下:增長一個/hello的http服務來獲取session,以及session的最大活躍間隔,即session超時時間。。
@GetMapping("/hello") public String hello(){ ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); HttpSession session = servletRequestAttributes.getRequest().getSession(); return "hello,sessonId="+session.getId()+"\r\n"+ "MaxInactiveInterval="+session.getMaxInactiveInterval()+" CreationTime="+session.getCreationTime()+" LastAccessedTime="+session.getLastAccessedTime(); }
在瀏覽器裏輸入對應的url驗證(見下圖),並用fiddler抓包。
下圖爲驗證結果:可見session超時時間被設置成了3600s,即60分鐘。
fiddler抓包狀況以下,可見cookiename修改成xxxSession。
redis裏存儲的namespace多了一級xxx(見下圖)。。原來直接是spring.session.sessions,如今是spring.session.xxx.sessions
原文出處:https://www.cnblogs.com/codeya/p/spring_session_redis_config_cookiename_session_timeout_redis_namespace.html