使用 Spring 启动和嵌入式 Tomcat 启用会话持久性
Enable session persistence with Spring Boot and embedded Tomcat
我正在开发一个具有 Spring 引导和 Spring 安全性的应用程序,方法是在带有嵌入式 Tomcat 的 Eclipse 中启动应用程序 class。每次我重新启动服务器时,我的会话都会消失,我必须重新登录,这变得非常烦人。
是否可以在服务器重启之间保持会话?
我在 Whosebug 上看到了另一个问题,有人问了相反的问题,这让我认为这实际上应该开箱即用:
How to disable Tomact session persistence in Spring Boot via Manager pathname?
我是 运行 Spring Boot 1.2.1 Gradle。
顺便说一句,我知道 Spring 已加载,但有时服务器重启是不可避免的。
这是我自己想出来的。每次启动应用程序时,Spring 都会在 /tmp
中为 Tomcat 的基本目录(例如 /tmp/tomcat.5990562997404648887.8080
)生成一个新的随机临时目录。由于它在每次启动时使用不同的文件夹,Tomcat 无法恢复会话。
这可以通过使用 server.tomcat.basedir=/tmp
设置您自己的基本目录来解决。但是,我不认为这是一个修复,因为它需要设置一个操作系统特定的目录,所以我打开了一个关于这个的错误:https://github.com/spring-projects/spring-boot/issues/2490
根据 Spring 这将在 1.3.0.M2 中得到修复,并最终在 1.3.0.RELEASE[= 中得到修复27=]
然后您所要做的就是将以下行添加到您的 application.properties
文件中。
server.session.persistent=true
在最近的 Spring 版本中,这已被弃用并替换为:
server.servlet.session.persistent=true
引用https://github.com/spring-projects/spring-boot/issues/2490
Update Tomcat, Jetty and Undertow to serialize session data when the
application is stopped and load it again when the application
restarts.
Persistent session are opt-in; either by setting persistentSession
on the ConfigurableEmbeddedServletContainer or by using the property
server.session.persistent=true
.
Fixes gh-2490
我通过使用 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
完美配合
我正在开发一个具有 Spring 引导和 Spring 安全性的应用程序,方法是在带有嵌入式 Tomcat 的 Eclipse 中启动应用程序 class。每次我重新启动服务器时,我的会话都会消失,我必须重新登录,这变得非常烦人。
是否可以在服务器重启之间保持会话?
我在 Whosebug 上看到了另一个问题,有人问了相反的问题,这让我认为这实际上应该开箱即用:
How to disable Tomact session persistence in Spring Boot via Manager pathname?
我是 运行 Spring Boot 1.2.1 Gradle。
顺便说一句,我知道 Spring 已加载,但有时服务器重启是不可避免的。
这是我自己想出来的。每次启动应用程序时,Spring 都会在 /tmp
中为 Tomcat 的基本目录(例如 /tmp/tomcat.5990562997404648887.8080
)生成一个新的随机临时目录。由于它在每次启动时使用不同的文件夹,Tomcat 无法恢复会话。
这可以通过使用 server.tomcat.basedir=/tmp
设置您自己的基本目录来解决。但是,我不认为这是一个修复,因为它需要设置一个操作系统特定的目录,所以我打开了一个关于这个的错误:https://github.com/spring-projects/spring-boot/issues/2490
根据 Spring 这将在 1.3.0.M2 中得到修复,并最终在 1.3.0.RELEASE[= 中得到修复27=]
然后您所要做的就是将以下行添加到您的 application.properties
文件中。
server.session.persistent=true
在最近的 Spring 版本中,这已被弃用并替换为:
server.servlet.session.persistent=true
引用https://github.com/spring-projects/spring-boot/issues/2490
Update Tomcat, Jetty and Undertow to serialize session data when the application is stopped and load it again when the application restarts.
Persistent session are opt-in; either by setting
persistentSession
on the ConfigurableEmbeddedServletContainer or by using the propertyserver.session.persistent=true
.Fixes gh-2490
我通过使用 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
完美配合