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 ...
随机推荐
- TCP连接时动态端口的相关问题说明
最近在线上遇到一个TCP动态端口相关的问题,之前没有留意过此类问题,做个笔记记录在这里,希望也能给大家提供个参考. 简单介绍下问题的场景:Windows服务器上,部署了网关程序SG和RPC进程,其中R ...
- python的数据缓存
Python的数据缓存 python 的内置数据类型,数值型,字符串,列表,字典等都会有自己的对象缓存池, 这样做的好处是,避免了频繁的申请内存,释放内存,这样会极大的降低应用程序的运行速度,还会造成 ...
- Layui事件监听(表单和数据表格)
一.表单的事件监听 先介绍一下几个属性的用法 1.lay-filter 事件过滤器 相当于选择器,layui的专属选择器 2.lay-verify 验证属性 属性值可以是 :required必填项, ...
- 微信小程序自动化,记录趟过的坑!
项目思想:关键字+数据驱动混合测试 基于Android-微信小程序自动化的关键是:webview的切换 对于微信App来说如何从NATIVE切换到webview的过程 测试版本信息 1.微信版本:7. ...
- 工具-效率工具-listary快速打开文件,win+R使用(99.1.1)
@ 目录 1.使用WIN+R打开软件 2.使用listary软件 1.使用WIN+R打开软件 添加环境变量 找到需要打开应用的目录 如我的桌面(C:\Users\Public\Desktop) 添加p ...
- Spring Cloud Alibaba基础教程-Nacos(三)
在Spring Cloud Alibaba基础教程-Nacos(二)当中学习了,如何使用 nacos图形化界面操作 ,使用Nacos部署集群,下面我们开始Nacos最后一篇的学习 ,如果对你有帮助,记 ...
- Solr:Slor初识(概述、Windows版本的安装、添加IK分词器)
1.Solr概述 (1)Solr与数据库相比的优势 搜索速度更快.搜索结果能够按相关度排序.搜索内容格式不固定等 (2)Lucene与Solr的区别 Lucene提供了完整的查询引擎和索引引擎,目的是 ...
- c# 递归 yield关键字的用法
1.yield实现的功能 yield return: 先看下面的代码,通过yield return实现了类似用foreach遍历数组的功能,说明yield return也是用来实现迭代器的功能的. u ...
- 【进程/作业】篇章一:Linux进程及其管理(进程的管理基础)
概述:监控系统各方面的性能,保障各类服务的有序运行,是运维工作的重要组成部分,本篇就介绍一次常用的系统监控命令和相关的参数说明 具体包含以下几部分: 1.进程的管理基础 ,主要是讲一下概念性的东西 2 ...
- Spring Data Cache
Spring Data Cache注解使用 方法是一个对象,使用对象中的属性,如ID,作为cache key RedisConnection超时设置 参考 SpringBoot使用Redis缓存