Spring Session - HttpSession(快速入门)
本指南介绍如何使用 Spring Session 以透明方式利用 Redis 作为 Web 应用 HttpSession
的支持,使用 Java 配置。
你可以在 httpsession 示例应用 中找到完整的指南。 |
更新依赖
在使用 Spring Session 之前,必须更新依赖。如果你使用 Maven,需要添加以下依赖
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>3.4.3</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>6.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>6.2.5</version>
</dependency>
</dependencies>
由于我们使用的是 SNAPSHOT 版本,需要确保添加 Spring Snapshot Maven 仓库。你需要在 pom.xml 中包含以下内容
<repositories>
<!-- ... -->
<repository>
<id>spring-snapshot</id>
<url>https://repo.spring.io/libs-snapshot</url>
</repository>
</repositories>
Spring Java 配置
添加所需的依赖后,我们可以创建 Spring 配置。Spring 配置负责创建一个 servlet 过滤器,该过滤器将 HttpSession
的实现替换为由 Spring Session 支持的实现。为此,请添加以下 Spring 配置
@Configuration(proxyBeanMethods = false)
@EnableRedisHttpSession (1)
public class Config {
@Bean
public LettuceConnectionFactory connectionFactory() {
return new LettuceConnectionFactory(); (2)
}
}
1 | @EnableRedisHttpSession 注解会创建一个名为 springSessionRepositoryFilter 的 Spring Bean,它实现了 Filter 接口。该过滤器负责将 HttpSession 实现替换为由 Spring Session 支持的实现。在此示例中,Spring Session 由 Redis 提供支持。 |
2 | 我们创建一个 RedisConnectionFactory ,用于将 Spring Session 连接到 Redis 服务器。我们将连接配置为连接到 localhost 的默认端口 (6379)。有关配置 Spring Data Redis 的更多信息,请参阅 参考文档。 |
Java Servlet 容器初始化
我们的 Spring 配置 创建了一个名为 springSessionRepositoryFilter
的 Spring Bean,它实现了 Filter
接口。springSessionRepositoryFilter
bean 负责将 HttpSession
替换为由 Spring Session 支持的自定义实现。
为了让我们的 Filter
起作用,Spring 需要加载我们的 Config
类。最后,我们需要确保我们的 Servlet 容器(例如 Tomcat)为每个请求使用我们的 springSessionRepositoryFilter
。幸运的是,Spring Session 提供了一个名为 AbstractHttpSessionApplicationInitializer
的工具类,可以轻松完成这两个步骤。以下是示例
public class Initializer extends AbstractHttpSessionApplicationInitializer { (1)
public Initializer() {
super(Config.class); (2)
}
}
我们类的名称 (Initializer ) 不重要。重要的是我们必须扩展 AbstractHttpSessionApplicationInitializer 。 |
1 | 第一步是扩展 AbstractHttpSessionApplicationInitializer 。这样做可以确保名为 springSessionRepositoryFilter 的 Spring Bean 为每个请求都注册到我们的 Servlet 容器中。 |
2 | AbstractHttpSessionApplicationInitializer 还提供了一种机制来确保 Spring 加载我们的 Config 。 |
httpsession 示例应用
运行 httpsession
示例应用
可以通过获取 源代码 并执行以下命令来运行示例
$ ./gradlew :spring-session-sample-javaconfig-redis:tomcatRun
要使示例工作,必须在 localhost 上安装 Redis 2.8+ 并以默认端口 (6379) 运行。或者,你可以更新 RedisConnectionFactory 以指向另一个 Redis 服务器。另一种选择是使用 Docker 在 localhost 上运行 Redis。有关详细说明,请参阅 Docker Redis 仓库。 |
现在应该能够访问 localhost:8080/ 上的应用了
工作原理
我们在以下所示的 SessionServlet
中与标准的 HttpSession
进行交互
@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。该 cookie 包含你会话的 ID。你可以查看 cookie(使用 Chrome 或 Firefox)。
可以使用 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/ 上的应用,会看到我们添加的属性不再显示。