SpringBoot--开发实战--Session(三十九)
2019-08-09 本文已影响18人
无剑_君
一、 Session简介
session会话机制是一种服务器端机制,它使用类似于哈希表(可能还有哈希表)的结构来保存信息。当程序需要为客户端的请求创建会话时,服务器首先检查客户端的请求是否包含会话标识符(称为会话ID)。如果包含它,它先前已为此客户端创建了一个会话。服务器根据会话ID检索会话(无法检索,将创建新会话),如果客户端请求不包含会话ID,则为客户端创建会话并生成与会话关联的会话ID。 session id应该是一个既不重复也不容易被复制的字符串。会话ID将返回给客户端以保存此响应。
保存此会话ID的方法可以是cookie,以便浏览器可以根据交互期间的规则自动将此标志用于服务器。通常,此cookie的名称与SEEESIONID类似。但是,cookie可以被人为禁止,因此必须有其他机制在禁用cookie时将会话ID传递回服务器。经常使用的一种技术称为URL重写,它只是将会话ID直接附加到URL路径。还有一种称为形式隐藏字段的技术。也就是说,服务器将自动修改表单并添加隐藏字段,以便在提交表单时将会话ID传递回服务器。
二、Maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
三、Session使用
- 启动类
@SpringBootApplication
// 扫描servlet注解,通过 @WebServlet、@WebFilter、@WebListener 注解自动注册
@ServletComponentScan(basePackages = "com.xtsz.*")
public class SpringSessionApplication {
public static void main(String[] args) {
SpringApplication.run(SpringSessionApplication.class, args);
}
}
- 控制器
@Controller
@RequestMapping(value = "/")
public class IndexController {
@ResponseBody
@GetMapping(value = "/session")
public Map<String, Object> getSession(HttpServletRequest request) {
// 添加数据到Session
request.getSession().setAttribute("username", "admin");
// 添加sessionID到Map
Map<String, Object> map = new HashMap<>();
map.put("sessionId", request.getSession().getId());
return map;
}
@ResponseBody
@GetMapping(value = "/get")
public String get(HttpServletRequest request) {
// 获取Session数据
String userName = (String) request.getSession().getAttribute("username");
return userName;
}
@ResponseBody
@GetMapping(value = "/logout")
public String logout(HttpServletRequest request) {
// 销毁sessioin
request.getSession().invalidate();
return "ok";
}
}
- 监听器
必须添加注解:@WebListener,SpringBoot启动时将会通过加入的注解@ServletComponentScan对该类进行扫描注入。
@WebListener
@Slf4j
public class SessionListener implements HttpSessionListener {
private int onlineCount = 0;//记录session的数量
/**
* session创建后执行
*/
@Override
public void sessionCreated(HttpSessionEvent se) {
onlineCount++;
log.info("【HttpSessionListener监听器】 sessionCreated, onlineCount:" + onlineCount);
se.getSession().getServletContext().setAttribute("onlineCount", onlineCount);
}
/**
* session失效后执行
*/
@Override
public void sessionDestroyed(HttpSessionEvent se) {
if (onlineCount > 0) {
onlineCount--;
}
log.info("【HttpSessionListener监听器】 sessionDestroyed, onlineCount:" + onlineCount);
se.getSession().getServletContext().setAttribute("onlineCount", onlineCount);
}
}
-
测试
创建Session
创建Session
销毁Session
四、常用配置
# 设置cookie描述
server.session.cookie.comment=
# 设置cookie作用域
server.session.cookie.domain=
# 设置cookie是否只读
server.session.cookie.http-only=
# 设置cookie最大有效时间
server.session.cookie.max-age=
# 设置cookie名称
server.session.cookie.name=
# 设置cookie生效路径
server.session.cookie.path=
# 如果使用SSL,设置为true
server.session.cookie.secure=
# 是否在重启时持久化session
server.session.persistent=
# 存储路径
server.session.store-dir=
# session过期时间
server.session.timeout=
# 设置session跟踪模式(可以设置为"cookie", "url", "ssl")
server.session.tracking-modes=