现状

项目在使用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. 题解-CF1418G Three Occurrences

    题面 CF1418G Three Occurrences 给一个 \(n\) 个数的序列 \(a_i\),求每个出现过的数出现次数为 \(3\) 的子序列个数. 数据范围:\(1\le n\le 5\ ...

  2. Codeforces Edu Round 60 A-E

    A. Best Subsegment 显然,选择数列中的最大值当做区间(长度为\(1\)).只要尝试最大值这个区间是否能扩展(左右两边值是否跟它一样就行了) #include <cstdio&g ...

  3. 在DLL中使用对话框

    在 DLL 中使用对话框资源与在 EXE 中使用是有所区别的,处理不当便会造成断言失败.原因是因为 CDialog::Create 与 CreateEx 默认使用当前进程中的资源(Dialog Tem ...

  4. SSM框架中常用的注解及含义

    @Controller---使用它标记在一个类上,dispatcher会扫描使用该注解类的方法,并检测该方法是否使用了@RequestMapping注解,加上RequestMapping注解的方法才是 ...

  5. 关于svg格式问题

    背景介绍: 在使用photoswipe的时候,引入了css,按钮是使用svg进行展示的,在用vs2010开发调试过程中,发现不能显示按钮.在请求.svg 的文件时,响应头中的content Type始 ...

  6. writeset参数配置探索——究竟在哪个角色上配置参数?

    关于writeset,一直以来我都是所有节点同时配置下面参数: binlog_transaction_dependency_tracking=WRITESET transaction_write_se ...

  7. 使用collectd+influxdb+grafna监控进程的健康状态

    一,前言 本文将介绍如何使用collectd+influxdb+grafna进行进程的监控,监控项为:进程健康状态. 思路为:使用collectd的processes插件进行程序进程的监控,储存到in ...

  8. swig python dynamic module does not define init function

    example_module = Extension('_example', sources=['example_wrap.c', 'example.c'], ) setup (name = 'exa ...

  9. Excel 快速跳到表格最后一行/第一行

    快速跳到表格的最后一行 首先鼠标选中一个带有数据的单元格,点击shift键,把鼠标放到该单元格底部的边缘地带,出现带四个方向的箭头为止,再连续点击鼠标左键两次,直接跳到表格的最后一行 快速跳到表格的最 ...

  10. .net core 和 WPF 开发升讯威在线客服与营销系统:系统总体架构

    本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程.本产品已经成熟稳定并投入商用. 在线演示环境:https://kf.shengxunwei.com 注意 ...