使用Spring Boot和嵌入式Tomcat启用会话持久性

时间:2015-02-12 12:13:24

标签: java spring spring-mvc tomcat spring-boot

我正在开发一个使用Spring Boot和Spring Security的应用程序,方法是在Eclipse中使用嵌入式Tomcat启动Application类。每次我重新启动服务器时,我的会话都会消失,我必须再次登录,这非常烦人。

是否可以在服务器重启之间保持会话?

我在Stackoverflow上看到了另一个问题,其中有人提出相反的问题,这让我觉得这实际上应该是开箱即用的:

How to disable Tomact session persistence in Spring Boot via Manager pathname?

我正在使用Gradle运行Spring Boot 1.2.1。

顺便说一下,我知道Spring Loaded,但有时服务器重启是不可避免的。

3 个答案:

答案 0 :(得分:9)

根据Spring,这将在 1.3.0.M2 中修复,最终在 1.3.0.RELEASE

中修复

然后,您只需将以下行添加到application.properties文件中。

server.session.persistent=true

在最近的Spring版本中,这已被弃用并替换为:

server.servlet.session.persistent=true

参考https://github.com/spring-projects/spring-boot/issues/2490

  

更新Tomcat,Jetty和Undertow以序列化会话数据   应用程序停止并在应用程序时再次加载它   重新启动。

     

持久会话是选择加入;通过设置persistentSession   在ConfigurableEmbeddedServletContainer上或使用该属性   server.session.persistent=true

     

修正了gh-2490

答案 1 :(得分:5)

我自己就是这么想的。每次启动应用程序时,Spring都会在/tmp中为Tomcat的基本目录(例如/tmp/tomcat.5990562997404648887.8080)生成一个新的随机临时目录。由于它在每次启动时使用不同的文件夹,因此Tomcat无法恢复会话。

可以通过使用server.tomcat.basedir=/tmp设置自己的基本目录来解决此问题。但是,我不认为这是一个修复,因为它需要设置一个特定于操作系统的目录,所以我打开了一个错误:https://github.com/spring-projects/spring-boot/issues/2490

答案 2 :(得分:1)

我通过使用Redis保留会话信息来解决它。

您需要做的就是在application.yml文件中指定一些选项:

server:
  servlet:
    session:
      persistent: true
spring:
  session:
    store-type: redis
  redis:
    host: localhost
    port: 6379
 ...

build.gradle

    plugins {
       id 'java'
       id 'io.spring.dependency-management' version '1.0.6.RELEASE'
       id 'org.springframework.boot' version '2.1.3.RELEASE'
   }
    ...
    // Spring Framework
    compile(
            'org.springframework.boot:spring-boot-starter-web',
            'org.springframework.boot:spring-boot-starter-data-jpa',
            'org.springframework.data:spring-data-redis',
            'org.springframework.boot:spring-boot-starter-security'
    )
    ...

与Spring Boot 2.1.3完美配合