# Spring 实现分布式 Session
## 一、项目结构
分布式 Session 主要配置文件为 spring-session.xml 和 web.xml,其他的配置为标准的 web 工程的配置:
## 二、实现分布式 Session
### 2.1 基本依赖
```xml
org.springframework.data
spring-data-redis
2.1.3.RELEASE
redis.clients
jedis
2.9.0
org.springframework.session
spring-session-data-redis
2.1.3.RELEASE
```
### 2.2 Session 拦截器
在 web.xml 中配置 Session 拦截器:
```xml
springSessionRepositoryFilter
org.springframework.web.filter.DelegatingFilterProxy
springSessionRepositoryFilter
/*
```
### 2.3 实现原理
Spring 通过将 Session 信息存储到公共容器中,这样不同的 Web 服务就能共享到相同的 Session 信息,从而实现分布式 Session。Spring 支持使用 Redis, Jdbc,mongodb,Hazelcast 等作为公共的存储容器。这里我们以 Redis 作为公共的存储容器,需要创建配置文件 spring- session.xml,内容如下:
```xml
```
## 三、验证分布式 Session
### 3.1 测试准备
创建测试接口和测试页面:
```java
@Controller
public class LoginController {
@RequestMapping
public String index(){
return "index";
}
@RequestMapping("home")
public String home(){
return "home";
}
@PostMapping("login")
public String login(User user, HttpSession session, HttpServletRequest request, Model model){
// 随机生成用户 id
user.setUserId(Math.round(Math.floor(Math.random() *10*1000)));
// 将用户信息保存到 id 中
session.setAttribute("USER",user);
return "redirect:home";
}
}
```
登录页面:
```jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
登录页面
服务器:<%=request.getServerName()+":"+request.getServerPort()%>
```
session 信息展示页面 (home.jsp):
```jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
主页面
服务器:<%=request.getServerName()+":"+request.getServerPort()%>
登录用户: ${sessionScope.USER.username}
用户编号: ${sessionScope.USER.userId}
```
### 3.2 测试结果
这里采用两个 Tomcat 分别启动项目,在第一个项目的 index.jsp 页面进行登录;第二个项目不登录,直接访问 Session 展示页home.jsp :
Tomcat 1 配置:
Tomcat 2 配置:
**测试结果:**