目录
1. 引入
默认情况下,WEB服务器无法区分一个HTTP请求是否为第一次访问。
- 因此,我们通过会话跟踪(请求一次就可以跟踪请求)的方式,来记录是否为第一次访问。
- 第一次请求输入登录信息,之后再次请求时,便可跟踪到上一次的请求,无需再次输入验证信息,直接登录。直到关闭浏览器或退出访问。
2. 4种常用会话管理技术
-
2.1 URL重写(后端处理)
- 将一些请求参数(通常为key=value的形式),添加到URL的查询字符中
- 缺点
- 浏览器会对URL的长度进行一定的限制,不适用于请求参数过多的情况
- 静态页面需要使用JavaScript在前端页面上获取参数,麻烦,难度大
- 特殊字符不容易处理,需要对其进行编码,才能保证字符的安全性
- 由于信息的安全性,以及URL重写的可见性,不适用想要对信息进行保密的情况
- 适用场景
- 信息仅在少量页面间传递,且信息不敏感。
-
2.2 隐藏域(前端处理)
- 类似于URL重写,但是将值放到HTML表单的隐藏域中。
- 外部看不到,只有服务端能看到
- 注意
- 和url一样,控制页面之间的跳转尽量不要超过三个
- 优点
- 没有字符数限制
- 无需额外的编码
-
2.3 Cookies
- 特点
- 是一个信息片段,可以自动的在浏览器和Web服务期间交互。
- 可存储在多个页面间传递的信息
- 过程
- 将信息存储到浏览器上,给浏览器存储一个cookie的片段,浏览器会在每次发请求的时候,将片段传给服务器。
- 为了安全考虑,可以设置Cookies的有效时间
- Cookies是数据片段,也有限制,通常支持每个网站20个Cookies。
- Cookies的删除
- 没有办法直接的删除Cookies,可以通过设置有效时间间接进行删除
- 即,将存活时间设置为0秒 -> 立即过期(删除)
- cookies.setMaxAge(0);之后,resp.addCookie(cookies);
- 即,将存活时间设置为0秒 -> 立即过期(删除)
- 没有办法直接的删除Cookies,可以通过设置有效时间间接进行删除
- 特点
-
2.4 HttpSession
- 打开浏览器访问页面,就为浏览器建立了一次会话,建立了HttpSession。
- 特点
- 一个用户可以有且仅有一个HttpSession,且不会被其他用户访问到。
- 只在第一次访问时,自动创建
- 可以跨所有页面
- 存储数据要求
- 存放至HttpSession的值,是存储在内存中的。
- 可以放大对象,但不应该放特别大的对象或太多的对象,否则内存占比特别大。这时,servlet容器可能将其存储在二级存储上(磁盘),可能会存在性能问题。
- 存放的数据是Object类型,当内存不够就会存储至磁盘、文件或数据库中,这就需要序列化技术。对象需要实现序列化接口。
- 原理
- HttpServlet会话跟踪依赖于cookie
- 一旦创建HttpServlet对象,Servlet容器就会为每个HttpSession自动生成唯一标识,是名为JSESSIONID的cookie的value。
- 把这个cookie给浏览器,浏览器就有了jsessionid的cookie,浏览器在每次发送请求时,都会将cookie发送给服务端
- 发送两种方式
- 请求头的方式
- 将参数加到URL上(URL重写)
- 发送两种方式
- 根据jsessionId,服务端就可以识别给请求是由那个用户发起的
- 封装后,将cookie放入session,根据getAttrubution获取到值。
- 有效性
- 在web.xml中设置过期时间,使其不永久有效
- 不失效危害
- HttpSession占用堆内存,导致堆内存消耗、负载量过大。
- 不配置过期时间,使用容器默认配置(30分钟)