对于最新的稳定版本,请使用 Spring Session 3.5.0

Spring Session - HttpSession(快速入门)

本指南介绍了如何使用 Spring Session 透明地利用 Redis 来支持 Web 应用程序的HttpSession使用 Java 配置。

您可以在 httpsession 示例应用程序中找到完整的指南。

更新依赖项

在使用 Spring Session 之前,您必须更新依赖项。 如果您使用的是 Maven,则必须添加以下依赖项:

pom.xml
<dependencies>
	<!-- ... -->

	<dependency>
		<groupId>org.springframework.session</groupId>
		<artifactId>spring-session-data-redis</artifactId>
		<version>3.0.4</version>
		<type>pom</type>
	</dependency>
	<dependency>
		<groupId>io.lettuce</groupId>
		<artifactId>lettuce-core</artifactId>
		<version>6.2.1.RELEASE</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-web</artifactId>
		<version>6.0.13</version>
	</dependency>
</dependencies>

由于我们使用的是 SNAPSHOT 版本,因此需要确保添加 Spring Snapshot Maven Repository。 您的pom.xml中必须包含以下内容:

pom.xml
<repositories>

	<!-- ... -->

	<repository>
		<id>spring-snapshot</id>
		<url>https://repo.spring.io/libs-snapshot</url>
	</repository>
</repositories>

Spring Java 配置

添加所需的依赖项后,我们可以创建 Spring 配置。 Spring 配置负责创建一个 servlet 过滤器,该过滤器将HttpSessionimplementation 替换为 Spring Session 支持的 implementation。 为此,请添加以下 Spring Configuration:

@Configuration(proxyBeanMethods = false)
@EnableRedisHttpSession (1)
public class Config {

	@Bean
	public LettuceConnectionFactory connectionFactory() {
		return new LettuceConnectionFactory(); (2)
	}

}
1 @EnableRedisHttpSessionannotation 会创建一个名称为springSessionRepositoryFilter实现Filter. 过滤器负责替换HttpSession实现,由 Spring Session 支持。 在这种情况下, Spring Session 由 Redis 提供支持。
2 我们创建一个RedisConnectionFactory将 Spring Session 连接到 Redis 服务器。 我们将连接配置为连接到默认端口 (6379) 上的 localhost。 有关配置 Spring Data Redis 的更多信息,请参阅参考文档

Java Servlet 容器初始化

我们的 Spring 配置创建了一个名为springSessionRepositoryFilter实现Filter. 这springSessionRepositoryFilterbean 负责将HttpSession使用由 Spring Session 支持的自定义实现。

为了我们的Filter为了发挥它的魔力,Spring 需要加载我们的Config类。 最后,我们需要确保我们的 Servlet 容器(即 Tomcat)使用我们的springSessionRepositoryFilter对于每个请求。 幸运的是,Spring Session 提供了一个名为AbstractHttpSessionApplicationInitializer使这两个步骤都变得简单。 示例如下:

来源/main/java/sample/Initializer.java
public class Initializer extends AbstractHttpSessionApplicationInitializer { (1)

	public Initializer() {
		super(Config.class); (2)
	}

}
我们类的名称 (Initializer) 无关紧要。重要的是,我们扩展AbstractHttpSessionApplicationInitializer.
1 第一步是扩展AbstractHttpSessionApplicationInitializer. 这样做可以确保名称为springSessionRepositoryFilter对于每个请求,都在我们的 Servlet 容器中注册。
2 AbstractHttpSessionApplicationInitializer还提供了一种机制来确保 Spring 加载我们的Config.

httpsession 示例应用程序

运行httpsession示例应用程序

您可以通过获取源码并调用以下命令来运行该示例:

$ ./gradlew :spring-session-sample-javaconfig-redis:tomcatRun
要使该示例正常工作,您必须在 localhost 上安装 Redis 2.8+,并使用默认端口 (6379) 运行它。 或者,您也可以更新RedisConnectionFactory以指向 Redis 服务器。 另一种选择是使用 Docker 在本地主机上运行 Redis。 有关详细说明,请参阅 Docker Redis 存储库

您现在应该能够访问 localhost:8080/ 中的应用程序

探索httpsession示例应用程序

现在您可以尝试使用该应用程序。为此,请在表单中填写以下信息:

现在单击 Set Attribute 按钮。您现在应该会看到表中显示的值。

它是如何工作的?

我们与标准HttpSessionSessionServlet如下面的清单所示:

来源/main/java/sample/SessionServlet.java
@WebServlet("/session")
public class SessionServlet extends HttpServlet {

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		String attributeName = req.getParameter("attributeName");
		String attributeValue = req.getParameter("attributeValue");
		req.getSession().setAttribute(attributeName, attributeValue);
		resp.sendRedirect(req.getContextPath() + "/");
	}

	private static final long serialVersionUID = 2878267318695777395L;

}

而不是使用 Tomcat 的HttpSession,我们将值保存在 Redis 中。 Spring Session 会创建一个名为SESSION在浏览器中。 该 Cookie 包含会话的 ID。 您可以查看 Cookie(使用 ChromeFirefox)。

您可以使用 redis-cli 删除会话。 例如,在基于 Linux 的系统上,您可以键入以下内容:

	$ redis-cli keys '*' | xargs redis-cli del
Redis 文档包含安装 redis-cli 的说明。

或者,您也可以删除显式密钥。在您的终端中输入以下内容,确保将7e8383a4-082c-4ffe-a4bc-c40fd3363c5e替换为您的 SESSION cookie 的值:

	$ redis-cli del spring:session:sessions:7e8383a4-082c-4ffe-a4bc-c40fd3363c5e

现在,您可以在 localhost:8080/ 上访问应用程序,并看到我们添加的属性不再显示。