Spring Boot 应用使用spring session+redis启用分布式session后,如何在配置文件里设置应用的cookiename、session超时时间、redis存储的nam...

现状

项目在使用Spring Cloud搭建微服务框架,其中分布式session采用spring session+redis 模式

需求

希望可以在配置文件(application.yml)里设置应用的cookiename、session超时时间以及redis存储的namespace

目前已知可以通过下面的方式设置session超时时间和redis存储session的namespace。

1.@EnableRedisHttpSession(maxInactiveIntervalInSeconds=3600,redisNamespace="xxx")--硬编码,自己未测试

2.使用vm参数-Dspring.session.redis.namespace=xxx来设置redis的nameapce --已测试可以生效

但这都不是我们想要的效果。。我们希望可以在配置文件里设置这些参数。

设计的配置文件的相关参数如下

1app: 2 product: 3 session: 4 redisnamespace: ${app.product.name} #存储分布式session时redis的命名空间 5 timeout: 60 #session超时时间,单位:分钟。 6 cookiename: ${app.product.name}SESSION #注意每个不同的应用此cookiename应该不相同

其中

1app.product.cookiename的值是希望设置的cookiename 2 3app.product.session.timeout是希望设置的session超时时间 4 5app.product.session.redisnamespace是希望设置的redis存储session的namespace

解决方案

在一个@Configuration类里

1.使用@Bean方式定义CookieHttpSessionStrategy 对象来解决cookiename的设置问题

2.通过@PostConstruct 方式修改RedisOperationsSessionRepository对象的session超时时间、namespace

具体代码如下:

设置cookiename

默认的cookiename是SESSION,不同的应用一般要求cookiename不相同,所以需要修改。。修改的方式可参考下文:

1 //从配置里读取cookiename,如果没有配置,则使用默认的DEFAULTSESSION 2 @Value("${app.product.cookiename:DEFAULTSESSION}") 3 String cookieName; 4 5 @Bean 6 public CookieHttpSessionStrategy cookieHttpSessionStrategy(){ 7 CookieHttpSessionStrategy strategy=new CookieHttpSessionStrategy(); 8 DefaultCookieSerializer cookieSerializer=new DefaultCookieSerializer(); 9 cookieSerializer.setCookieName(cookieName);//cookies名称 10 strategy.setCookieSerializer(cookieSerializer); 11 return strategy; 12 }

设置session超时时间(默认的超时时间是30分钟)、redis存放的namespace

具体见下文:通过@PostConstruct 方式修改RedisOperationsSessionRepository对象的属性

1/** 2 * 从配置的yml文件里取设置session超时时间,单位是分钟 3 * 如果没配置,则默认30分钟,即1800s 4 */ 5 @Value("${app.product.session.timeout:30}") 6 int sessionTimeoutInMinuts; 7 8 /** 9 * 从配置的yml文件里取设置session存储到redis时对应的namespace 10 */ 11 @Value("${app.product.session.redisnamespace:}") 12 String redisnamespace; 13 14 @Autowired 15 private RedisOperationsSessionRepository sessionRepository; 16 17 @PostConstruct 18 private void afterPropertiesSet() { 19 log.info("setting sesion 超时时间 = [{}]分钟",sessionTimeoutInMinuts); 20 sessionRepository.setDefaultMaxInactiveInterval(sessionTimeoutInMinuts * 60); 21 log.info("setting sesion 存储到redis时的namespace = [{}]",redisnamespace); 22 sessionRepository.setRedisKeyNamespace(redisnamespace); 23 }

测试代码如下:增加一个/hello的http服务来获取session,以及session的最大活跃间隔,即session超时时间。。

1@GetMapping("/hello") 2public String hello(){ 3 ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); 4 HttpSession session = servletRequestAttributes.getRequest().getSession(); 5 6 return "hello,sessonId="+session.getId()+"\r\n"+ 7 "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

点赞
收藏

评论区

加载中...

相关推荐

PHP Cookie与Session的使用与区别

Cookie与SessionCookie和session是目前使用的两种存储机制。cookie是从一个WEB页到下一个WEB页面的数据传送方法,cookie存储在客户端;Session是让数据在页面中持续有效的一个传递方法,session存储在服务器端。掌握了cookie与session这两个技术,在WEB网站页面间信息传递的安全性是

springboot+session(redis)(另附上:ip地址无法访问Redis)

springboot的版本:<version2.1.6.RELEASE</version搭建springboot框架涉及到session管理,交给springboot框架管理,同时为了以后分布式或集群等的扩展,故将session存储到Redis数据库中。理解::session交给spring管理,spring将session信息存储到

spring和Drools规则引擎的使用

Drools5.2.0.Final与Spring3集成测试在drools5.2,有一个jar包:droolsspring5.2.0.Final.jar,其中定义了在spring中应用的drools的扩展。通过这些扩展,可以直接在spring的配置文件中,配置knowledgebase、session等bean,从而在spring配置的程序中直

SpringBoot实现分布式session

实现分布式session实现基于redis的分布式session原理基于HttpRequestWapper,对request获取的Session实现类进行替换,即提供一个从redis获取数据的Session实现类依赖引入springbootstarterdatared

Java web.xml session

在JavaWeb开发中,Session为我们提供了很多方便,Session是由浏览器和服务器之间维护的。Session超时理解为:浏览器和服务器之间创建了一个Session,由于客户端长时间(休眠时间)没有与服务器交互,服务器将此Session销毁,客户端再一次与服务器交互时之前的Session就不存在了。设置Session超时时间方式:方式一:在

PHP如何配置session存储在redis

当网站用户量增多的时候,正常的session存取就会出现有点慢的问题,如果提高速度呢。我们可以使用redis去保存session的会话信息。PHP的会话默认是以文件的形式存在的,可以配置到NoSQL中,即提高了访问速度,又能很好地实现会话共享。 配置方式如下: 方法一:修改php.ini的设置session.save\_handler