Spring Boot 应用使用spring session+redis启用分布式session后,如何在配置文件里设置应用的cookiename、session超时时间、redis存储的namespace
现状
项目在使用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 --已测试可以生效
但这都不是我们想要的效果。。我们希望可以在配置文件里设置这些参数。
设计的配置文件的相关参数如下
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

Spring Boot 应用使用spring session+redis启用分布式session后,如何在配置文件里设置应用的cookiename、session超时时间、redis存储的namespace的更多相关文章
- 使用 Spring Boot 快速构建 Spring 框架应用--转
原文地址:https://www.ibm.com/developerworks/cn/java/j-lo-spring-boot/ Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2 ...
- 使用 Spring Boot 快速构建 Spring 框架应用,PropertyPlaceholderConfigurer
Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2002 年发布以来,Spring 框架已经成为企业应用开发领域非常流行的基础框架.有大量的企业应用基于 Spring 框架来开发.S ...
- Spring Boot——开发新一代Spring应用
Spring官方网站本身使用Spring框架开发,随着功能以及业务逻辑的日益复杂,应用伴随着大量的XML配置文件以及复杂的Bean依赖关系.随着Spring 3.0的发布,Spring IO团队逐渐开 ...
- Spring Boot(二):Spring Boot中的配置参数
Spring Boot 配置参数 Spring Boot 帮助我们完成了许许多多的自动化配置 如果我们需要根据自己的需求修改配置 也是可以的 可以使用.properties 和 .yml 格式配置 这 ...
- Spring Boot中使用 Spring Security 构建权限系统
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,为应用系统提供声明式的安全 ...
- spring boot 打包方式 spring boot 整合mybaits REST services
<build> <sourceDirectory>src/main/java</sourceDirectory> <plugins> <plugi ...
- 【spring cloud】子模块module -->导入一个新的spring boot项目作为spring cloud的一个子模块微服务,怎么做/或者 每次导入一个新的spring boot项目,IDEA不识别子module,启动类无法启动/右下角没有蓝色图标
如题:导入一个新的spring boot项目作为spring cloud的一个子模块微服务,怎么做 或者说每次导入一个新的spring boot项目,IDEA不识别,启动类无法启动,怎么解决 下面分别 ...
- Spring Boot:整合Spring Security
综合概述 Spring Security 是 Spring 社区的一个顶级项目,也是 Spring Boot 官方推荐使用的安全框架.除了常规的认证(Authentication)和授权(Author ...
- Spring Boot (十): Spring Boot Admin 监控 Spring Boot 应用
Spring Boot (十): Spring Boot Admin 监控 Spring Boot 应用 1. 引言 在上一篇文章<Spring Boot (九): 微服务应用监控 Spring ...
随机推荐
- tornado 作业 自定义模板 UIMethod以UIModule
自定义uimodule s3.py import tornado.ioloop import tornado.web import UIMethod as mt class MainHandler(t ...
- python命名切片
命名切片 c = slice(2, 5) a = [1, 2, 3, 4, 5, 6, 7] print(a[c])
- STL—— 容器(vector)begin() 与 rbegin() , end() 与 rend()
1. Vector 迭代器首地址与尾地址 begin() 和 end() 在代码中可以将迭代器用作参数的位置可以使用 begin() 和 end() 获取地址,如下代码: 1 #include &l ...
- apache重写URL时,排除静态资源
THINKPHP项目部署的apache 上面时,如果为了隐藏入口文件配置了重写URL,会导致将静态资源的URL也解析成Controller/Method,导致触发模块不存在 所以在URL重写配置中,需 ...
- 九、TestNG超时测试
"超时"表示如果单元测试花费的时间超过指定的毫秒数,那么TestNG将会中止它并将其标记为失败. 使用属性 timeOut = 参数(1s*1000) package com.lc ...
- Graphql Tutorials(Episode 01)
1.前言 最近认识到Graphql,它是一个基于DSL的api.我曾接触过一个pos机刷卡系统,它是基于JSON-DSL语言开发的框架,很有趣.可是后来,没有机会深入研究.直到最近我认识了Graphq ...
- Eureka系列(四) 获取服务Server端具体实现
获取服务 Server端流程 我们先看下面这张图片,这张图片简单描述了下我们EurekaClient在调用EurekaServer 提供的获取服务Http接口,Server端实现接口执行的大致流程 ...
- 程序综合设计实践 :QT实现计算器
程序综合设计实践 :用QT实现简易计算器及贷款计算 1,项目概述 该项目目标是设计开发一个支持连续计算的包括括号( ),求余%四则运算+ - * /的计算器 Calculator 以及贷款计算功能 M ...
- #2020征文-手机#深鸿会深大小组:HarmonyOS手机游戏—数字华容道
目录: 前言 概述 正文 创建项目 实现初始界面布局 实现数字的随机打乱 实现滑动或点击调换数字 实现游戏成功界面 结语 源码包 前言 12月16号HarmonyOS2.0手机开发者Beta版已经发布 ...
- 手把手教你搭饥荒专用服务器(五)—MOD自动下载安装(Windows+Linux)
想了解更详细内容,请点击原文地址:https://wuter.cn/1985.html/ 饥荒专用服务器的mod设置总共有两种方法. 方法一 在本地游戏中更新mod,然后把mod上传到服务器,但是这种 ...