# 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 配置:
**测试结果:**