现状

项目在使用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的更多相关文章

  1. 使用 Spring Boot 快速构建 Spring 框架应用--转

    原文地址:https://www.ibm.com/developerworks/cn/java/j-lo-spring-boot/ Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2 ...

  2. 使用 Spring Boot 快速构建 Spring 框架应用,PropertyPlaceholderConfigurer

    Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2002 年发布以来,Spring 框架已经成为企业应用开发领域非常流行的基础框架.有大量的企业应用基于 Spring 框架来开发.S ...

  3. Spring Boot——开发新一代Spring应用

    Spring官方网站本身使用Spring框架开发,随着功能以及业务逻辑的日益复杂,应用伴随着大量的XML配置文件以及复杂的Bean依赖关系.随着Spring 3.0的发布,Spring IO团队逐渐开 ...

  4. Spring Boot(二):Spring Boot中的配置参数

    Spring Boot 配置参数 Spring Boot 帮助我们完成了许许多多的自动化配置 如果我们需要根据自己的需求修改配置 也是可以的 可以使用.properties 和 .yml 格式配置 这 ...

  5. Spring Boot中使用 Spring Security 构建权限系统

    Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,为应用系统提供声明式的安全 ...

  6. spring boot 打包方式 spring boot 整合mybaits REST services

    <build> <sourceDirectory>src/main/java</sourceDirectory> <plugins> <plugi ...

  7. 【spring cloud】子模块module -->导入一个新的spring boot项目作为spring cloud的一个子模块微服务,怎么做/或者 每次导入一个新的spring boot项目,IDEA不识别子module,启动类无法启动/右下角没有蓝色图标

    如题:导入一个新的spring boot项目作为spring cloud的一个子模块微服务,怎么做 或者说每次导入一个新的spring boot项目,IDEA不识别,启动类无法启动,怎么解决 下面分别 ...

  8. Spring Boot:整合Spring Security

    综合概述 Spring Security 是 Spring 社区的一个顶级项目,也是 Spring Boot 官方推荐使用的安全框架.除了常规的认证(Authentication)和授权(Author ...

  9. Spring Boot (十): Spring Boot Admin 监控 Spring Boot 应用

    Spring Boot (十): Spring Boot Admin 监控 Spring Boot 应用 1. 引言 在上一篇文章<Spring Boot (九): 微服务应用监控 Spring ...

随机推荐

  1. CF1373F Network Coverage

    题目链接 对于每一个 \(i\) 可以看作一个管道.赋予三个信息: \(\text{minIn}_i\) 表示至少要从上一家 \(i - 1\) 得到连接数,才能正常供给 \(i\) 城市 \(\te ...

  2. Codeforces Edu Round 48 A-D

    A. Death Note 简单模拟,可用\(\%\)和 \(/\)来减少代码量 #include <iostream> #include <cstdio> using nam ...

  3. SpringBoot整合Swagger2详细教程

    1. 简介   随着前后端分离开发模式越来越流行,编写接口文档变成了开发人员非常头疼的事.而Swagger是一个规范且完整的web框架,用于生成.描述.调用可视化的RESTful风格的在线接口文档,并 ...

  4. 访问控制列表ACL应用

    ACL的应用的场景 应用在三层接口 • Nat地址转换 Nat(network address translation,地址转换)是将数据报报头中的ip地址转换为另一个ip地址的过程,主要用于实现内部 ...

  5. vue第一单元(初识webpack-webpack的功能-webpack的初步使用)

    第一单元(初识webpack-webpack的功能-webpack的初步使用) #课程目标 了解webpack出现的意义,以及webpack解决的前端问题 掌握webpack的使用流程和步骤 掌握we ...

  6. JYadmin-react-antd react+antd封装的优秀后台模板集成方案("^1.0.0")

    版本:[ "JYadmin-react-antd": "^1.0.0"] 版权所有:微信公众号[微新悦] 原文链接:https://www.weixinyue. ...

  7. angular 8 表单带文件上传接口

    <div id="homework"> <form (ngSubmit)="doSubmit()" enctype="multipa ...

  8. LightningChart -XY 2D图表特性

    LightningChart -XY 2D图表--2D图表 系列类型:抽样数据(离散数据).点线.任意形式的点线.面积.高低.多边形.股票系列(蜡烛图).条.带.恒定线.强度网格和强度网强度系列能够渲 ...

  9. VS2019开启调试,测试图片上传的时候,一点到图片上传,直接导致VS调试崩掉,返回 程序“[14764] iisexpress.exe”已退出,返回值为 -1 (0xffffffff)。 是什么原因导致的?

    试着使用管理员身份运行vs 今天调试的时候遇到个奇葩问题 一点上传控件选择文件后 就终止调试 发现根源不在上传控件 而是本地的中文输入法!关掉vs自动终止调试设置就好了 工具->选项-> ...

  10. python初学者-从键盘获取信息

    name = input(">>> 姓名:") QQ = input(">>>QQ: ") phone_num = inpu ...