|
对于最新稳定版本,请使用 Spring Session 4.0.2! |
Spring Session - HttpSession (快速入门)
更新依赖项
在使用Spring Session之前,您必须更新您的依赖项。 如果您使用的是Maven,您需要添加以下依赖项:
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>3.4.7</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.15</version>
</dependency>
</dependencies>
由于我们使用的是SNAPSHOT版本,因此需要确保在POM中添加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过滤器,该过滤器用基于Spring Session 的实现替换掉 HttpSession 实现。
要实现这一点,请添加以下Spring 配置:
@Configuration(proxyBeanMethods = false)
@EnableRedisHttpSession (1)
public class Config {
@Bean
public LettuceConnectionFactory connectionFactory() {
return new LettuceConnectionFactory(); (2)
}
}
| 1 | The @EnableRedisHttpSession注解创建一个名为springSessionRepositoryFilter的Spring Bean,该Bean实现了Filter。
过滤器负责将HttpSession实现替换为由Spring Session支持的实现。
在这种情况下,Spring Session通过Redis进行支持。 |
| 2 | 我们创建一个RedisConnectionFactory来将Spring Session与Redis服务器连接起来。
我们配置了连接信息,使其连接到本地主机的默认端口(6379)。
有关配置Spring Data Redis的更多信息,请参见参考文档。 |
Java Servlet 容器初始化
我们的springSessionRepositoryFilter的Spring Bean,该Bean实现了Filter。
springSessionRepositoryFilter Bean负责用一个由Spring Session支持的自定义实现来替换HttpSession。
为了使我们的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
对于样例要正常工作,您必须在本地主机上安装 Redis 2.8+ 并使用默认端口(6379)运行它。
或者,您可以更新 RedisConnectionFactory 指向一个 Redis 服务器。
另一个选项是使用 Docker 在本地主机上运行 Redis。
有关详细说明,请参阅 Docker Redis 仓库。 |
您应该能够通过以下地址访问应用:localhost:8080/
它是如何工作的?
我们与在以下列表中展示的标准 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。
您可以查看 cookies(使用Chrome 或 Firefox)。
您可以使用 redis-cli 移除会话。<br/> 例如,在基于 Linux 的系统上,可以输入以下命令:
$ redis-cli keys '*' | xargs redis-cli del
| The Redis 文档有安装 redis-cli 的说明。安装 redis-cli |
您可以删除显式的密钥。在终端中输入以下命令,确保将7e8383a4-082c-4ffe-a4bc-c40fd3363c5e替换为您的SESSION cookie的值:
$ redis-cli del spring:session:sessions:7e8383a4-082c-4ffe-a4bc-c40fd3363c5e
现在您可以在localhost:8080/访问应用程序,并看到我们添加的属性不再显示。