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

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

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

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

更新依赖项

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

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

	<dependency>
		<groupId>org.springframework.session</groupId>
		<artifactId>spring-session-data-redis</artifactId>
		<version>3.2.4</version>
		<type>pom</type>
	</dependency>
	<dependency>
		<groupId>io.lettuce</groupId>
		<artifactId>lettuce-core</artifactId>
		<version>6.2.7.RELEASE</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-web</artifactId>
		<version>6.1.9</version>
	</dependency>
</dependencies>

由于我们使用的是 SNAPSHOT 版本,因此我们需要确保添加 Spring Snapshot Maven 存储库。 您的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 过滤器,该过滤器将实现替换为 Spring Session 支持的实现。 为此,请添加以下 Spring 配置:HttpSession

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

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

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

Java Servlet 容器初始化

我们的 Spring Configuration 创建了一个名为 的 Spring Bean,用于实现 . Bean 负责用 Spring Session 支持的自定义实现替换 bean。springSessionRepositoryFilterFilterspringSessionRepositoryFilterHttpSession

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

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

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

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

httpsession 示例应用程序

运行示例应用程序httpsession

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

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

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

探索示例应用程序httpsession

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

  • 属性名称:用户名

  • 属性值:rob

现在单击“设置属性”按钮。现在,您应该会看到表中显示的值。

它是如何工作的?

我们与以下列表中所示的标准进行交互:HttpSessionSessionServlet

src/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 的 ,而是将这些值保留在 Redis 中。 Spring Session 会在您的浏览器中创建一个名为 cookie。 该 Cookie 包含您的会话的 ID。 您可以查看 cookie(使用 ChromeFirefox)。HttpSessionSESSION

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

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

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

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

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

若要使示例正常工作,必须在 localhost 上安装 Redis 2.8+ 并使用默认端口 (6379) 运行它。 或者,您可以将指向 Redis 服务器更新。 另一种选择是使用 Docker 在 localhost 上运行 Redis。 有关详细说明,请参阅 Docker Redis 存储库RedisConnectionFactory
Redis 文档包含安装 redis-cli 的说明。