我正在用Spring Boot和Spring Security开发一个应用程序,方法是在Eclipse中用嵌入式Tomcat启动application类。每次我重新启动服务器时,我的会话都会消失,我必须再次登录,这变得很烦人。
是否可以在服务器重新启动之间保持会话?
我在Stackoverflow上看到了另一个问题,有人问了相反的问题,这让我认为这应该是开箱即用的:
如何通过Manager路径名在Spring Boot中禁用Tomact会话持久性?
我正在和Gradle一起运行Spring Boot 1.2.1。
顺便说一句,我知道SpringLoaded,但有时服务器重启是不可避免的。
根据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
当应用程序停止,并在应用程序时再次加载重新启动。
持久会话是选择加入;通过设置
persistentSession
在ConfigurationEmbeddedServlet容器上,或使用属性server.session.persistent=true
。修复gh-2490
这是我自己想出来的。每次启动应用程序时,Spring都会在/tmp
中为Tomcat的基本目录(例如/tmp/tomcat.5990562997404648887.8080
)生成一个新的随机临时目录。由于每次启动时使用不同的文件夹,Tomcat无法恢复会话。
这可以通过使用server.tomcat.basedir=/tmp
设置自己的基本目录来解决。然而,我不认为这是一个修复,因为它需要设置一个特定于操作系统的目录,所以我打开了一个关于这个的bug:https://github.com/spring-projects/spring-boot/issues/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 完美配合