简介
Session和Cookie类似,也是一种会话跟踪技术,cookie是将会话状态保存在了浏览器端,而Session是将会话状态保存在了服务器端。
Session会为每个会话维护一个Session,不同的会话对应不同的Session。
Session在服务器上是以Map的形式存储的:
key | value |
---|---|
随机字符串,称为SessionID | Session对对象的引用 |
过程
后端将Session信息写入Session列表后,系统还会将SessionID作为name,将SessionID内容的随机字符串作为value以一个全局的Cookie的形式(就是当前web应用下任一路径都会带上这个cookie,因此可以跨请求共享数据)放到响应包头中,然后将该cookie返回给客户端并且存在缓存中
当再次发出请求时,客户端会带上这个cookie
默认失效时间
在最后一次访问后的30分钟后失效
并不会在你关闭浏览器后失效(除非浏览器设置关闭后立即清空缓存,因为返回的cookie是存在缓存中的),因为对用户来说打开关闭浏览器是一次会话,但是对服务器来说,seesion失效才算一次会话
设置失效时间
单位是秒s
session.setMaxInactiveInterval(100);
创建Session
- 通过getSession获取前端传来的HttpSession对象
- 可以设置参数true来设定若无Session对象自动创建
- 要共享的内容放在session的域当中
@WebServlet("/session")
public class SessionServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
String username=req.getParameter("username");
//获取session对象,参数为true,没有session对象就创建
HttpSession session=req.getSession(true);
session.setAttribute("username",username);
System.out.println(session.getId()+session.getAttribute("username"));
}
}
前端看到的,在响应中,以cookie的形式返回了Session
并且路径设置为当前web应用全局
再次请求
当我们再次发送请求,会把SessionID的cookie传过去(不同是因为这是分两次写的博客,这是两个session)
域属性空间范围的对比
ServletContext:整个应用,可以跨会话
HttpSession:会话范围,可以跨请求共享
HttpServletRequest:请求范围,可以跨Servlet
销毁
session.invalidate();