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

Stella981
• 阅读 898

现状

项目在使用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分钟。

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

fiddler抓包情况如下,可见cookiename修改为xxxSession。

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

redis里存储的namespace多了一级xxx(见下图)。。原来直接是spring.session.sessions,现在是spring.session.xxx.sessions

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

原文出处:https://www.cnblogs.com/codeya/p/spring\_session\_redis\_config\_cookiename\_session\_timeout\_redis\_namespace.html

点赞
收藏
评论区
推荐文章
莎利亚 莎利亚
3年前
PHP Cookie与Session的使用与区别
Cookie与SessionCookie和session是目前使用的两种存储机制。cookie是从一个WEB页到下一个WEB页面的数据传送方法,cookie存储在客户端;Session是让数据在页面中持续有效的一个传递方法,session存储在服务器端。掌握了cookie与session这两个技术,在WEB网站页面间信息传递的安全性是
Easter79 Easter79
3年前
springboot+session(redis)(另附上:ip地址无法访问Redis)
springboot的版本:<version2.1.6.RELEASE</version搭建springboot框架涉及到session管理,交给springboot框架管理,同时为了以后分布式或集群等的扩展,故将session存储到Redis数据库中。理解::session交给spring管理,spring将session信息存储到
Easter79 Easter79
3年前
spring和Drools规则引擎的使用
Drools5.2.0.Final与Spring3集成测试在drools5.2,有一个jar包:droolsspring5.2.0.Final.jar,其中定义了在spring中应用的drools的扩展。通过这些扩展,可以直接在spring的配置文件中,配置knowledgebase、session等bean,从而在spring配置的程序中直
Easter79 Easter79
3年前
SpringBoot实现分布式session
实现分布式session实现基于redis的分布式session原理基于HttpRequestWapper,对request获取的Session实现类进行替换,即提供一个从redis获取数据的Session实现类依赖引入springbootstarterdatared
Wesley13 Wesley13
3年前
Java web.xml session
在JavaWeb开发中,Session为我们提供了很多方便,Session是由浏览器和服务器之间维护的。Session超时理解为:浏览器和服务器之间创建了一个Session,由于客户端长时间(休眠时间)没有与服务器交互,服务器将此Session销毁,客户端再一次与服务器交互时之前的Session就不存在了。设置Session超时时间方式:方式一:在
Stella981 Stella981
3年前
PHP如何配置session存储在redis
当网站用户量增多的时候,正常的session存取就会出现有点慢的问题,如果提高速度呢。我们可以使用redis去保存session的会话信息。PHP的会话默认是以文件的形式存在的,可以配置到NoSQL中,即提高了访问速度,又能很好地实现会话共享。 配置方式如下: 方法一:修改php.ini的设置session.save\_handler
Stella981 Stella981
3年前
HTTPS 传输优化详解之动态 TLS Record Size
笔者在过去分析了诸多可以减少HTTPS传输延迟的方法,如分布式Session的复用;启用HSTS,客户端默认开启HTTPS跳转;采用HTTP/2传输协议;使用ChaCha20Poly1305算法减少移动端CPU运算时间等。通过这些方法,可以在很大程度上优化HTTPS在传输上的延迟,给网站用户带来较好的访问体验。最近
Stella981 Stella981
3年前
SpringBoot实现分布式session
实现分布式session实现基于redis的分布式session原理基于HttpRequestWapper,对request获取的Session实现类进行替换,即提供一个从redis获取数据的Session实现类依赖引入springbootstarterdatared
Stella981 Stella981
3年前
Laravel使用redis保存SESSION
Laravel使用redis保存SESSION首先确认服务器已经安装redis服务,php安装了redis扩展.1.打开config/database.php。在redis配置项中增加session的连接'session''host'
Wesley13 Wesley13
3年前
APACHE 2.2.15+TOMCAT6.0.26配置负载均衡
目标:使用apache和tomcat配置一个可以应用的web网站,要达到以下要求:1、Apache做为HttpServer,后面连接多个tomcat应用实例,并进行负载均衡。2、为系统设定Session超时时间,包括Apache和tomcat3、为系统屏蔽文件列表,包括Apache和tomcat