Spring Boot 應用使用spring session+redis啓用分佈式session後,如何在配置文件裏設置應用的cookiename、session超時時間、redis存儲的nam...

現狀

項目在使用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

相關文章
相關標籤/搜索