Spring Boot Session 基本使用
一、 Spring Session 简介
Spring Session 提供了管理用户session的API 和实现,直接集群环境Sesison管理,单浏览器多个Session,RESTful APIs Session,集群Session 管理集成并不依赖应用程序容器;支持Session存储Redis、GemFire、JDBC、Mongo。
二、 Spring Session 支持功能
l 同一个浏览器同一个网站,支持多个session问题。
l Restful API,不依赖于cookie。可通过header来传递jessionID。
l WebSocket和spring-session结合,同步生命周期管理。
三、 Spring Session 的使用步骤
生成
l 后台业务模块使用 Spring-Session 生成一个 Session
l 后台业务模块往Session 里设置信息
l 将 Session 存到 Redis 缓存中(支持持久化)
l 将 Session Id 返回给浏览器
l 浏览器根据 Cookie 方式保存 Session Id
使用
l 浏览器取出 Session Id 通过HTTP 报文带给后台
l 后台根据 Session Id 从Redis 里取出缓存的 Session
l 从 Session 中读取出信息,进行业务处理。
四、 Spring Session 对 HTTP 的支持
Spring Session对HTTP的支持是通过标准的servlet filter来实现的,这个filter必须要配置为拦截所有的web应用请求,并且它应该是filter链中的第一个filter。Spring Session filter会确保随后调用HttpServletRequest的getSession() 方法时,都会返回Spring Session的HttpSession实例,而不是应用服务器默认的HttpSession。
五、 Spring Session 集成项目示例
项目集成 Spring Session 框架
添加pom.xml 依赖
引入Spring Session和Redis需要的依赖:
<!--spring boot 与redis应用基本环境配置 -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
Spring Session 配置
创建一个Spring配置,用于创建一个支持Spring Session的Servlet Filter来代替原有的HttpSession的实现:
package com.peraglobal.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
@Configuration
@EnableRedisHttpSession
public class HttpSessionConfig {
}
说明:
- 这个类用配置redis服务器的连接。
- maxInactiveIntervalInSeconds为SpringSession的过期时间(单位:秒)。
创建配置文件 application.properties
redis.hostname=localhost
redis.port=6379
说明:
- 默认连接端口:6379
- 默认连接地址:localhost 。
- 修改则可以使用setPort() 方法和setHostName() 方法来修改默认的端口和连接地址
使用 Spring Session 示例
在 Controller 类中使用 session 功能:
package com.peraglobal.session.controller;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class CookieController {
@RequestMapping("/test/cookie")
public String cookie(@RequestParam("browser") String browser, HttpServletRequest request, HttpSession session) {
//取出session中的browser
Object sessionBrowser = session.getAttribute("browser");
if (sessionBrowser == null) {
System.out.println("不存在session,设置browser=" + browser);
session.setAttribute("browser", browser);
} else {
System.out.println("存在session,browser=" + sessionBrowser.toString());
}
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0) {
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + " : " + cookie.getValue());
}
}
return "index";
}
}
验证 spring session
确定 Redis 服务正在启动,然后启动 spring session 项目,在浏览器输入:localhost:8080/test/cookie?browser=chrome,后台显示:
注意:spring boot 版本是基于 1.4.7.RELEASE