会话技术
为了实现某一功能, 浏览器和服务器之见可能会产生多次请求和响应, 从浏览器访问服务器开始, 到最后访问结束, 期间产生的多次请求和响应加在一起, 称之为一次会话. 一个值得关心的问题是如何保存会话中产生的数据. 有如此啊两类技术可以解决这个问题.
2. Cookie
2.1 cooie 原理
-- 将会话中产生的数据保存在客户端.
浏览器向服务器发送请求, 其中只包含需要保存的数据, 服务器获取数据, 通过 set-cookie 响应头将数据响应给浏览器, 让其保存.
浏览器再次访问服务器时, 会在请求中通过 cookie 请求头携带上次保存的数据, 服务器可以根据 cookie 请求头获取数据.
2.2 实现 cookie
cookie 是基于 set-cookie 响应头和 cookie 请求头实现的. sun 公司为了简化 cookie 的操作, 提供了一套 cookie 的 API.
- // 创建 cookie
- Cookie cookie=new Cookie(String name,String value);
- cookie.getName();
- cookie.getValue();
- // 将 cookie 添加到 response 响应中, 并发给浏览器
- response.addCookie(cookie);
- // 从请求中获取 cookie, 获取请求中所有的 cookie 组成的数组
- // 注意: 如果请求中没有 cookie, 该方法返回值为 null, 时刻注意判空.
- Cookie[] cookies=request.getCookies();
2.3 设置 cookie 的存活时间
setMaxAge(int sec); // 设置存活的秒数
cookie 默认是会话级别的, 是保存在了浏览器的内存中, 浏览器一旦关闭, 内存随之释放, cookie 也随之消失.
如果设置了 setMaxAge, 则 cookie 会保存在浏览器对应的磁盘目录中, 这样不会随着浏览器的关闭而消失.
2.4 设置 cookie 的路径
setPath(String path);
默认路径为当前响应的 Servlet 所在路径.
设置路径后, 浏览器会在访问当前设置的路径是携带 cookie.
通常设置为当前 web 应用的根路径.
2.5 删除 cookie
没有删除 cookie 的 API.
如果想删除, 则可以向浏览器发送一个同名, 同 path 的 cookie, 并设置最大生存时间为 0.
因为浏览器根据 cookie 的名字和 path 判断是否为同一个 cookie, 所以后发的 cookie 会覆盖前面的 cookie, 又由于生存时间为 0, 则会马上删除.
3.session
3.1 session 原理
-- 将会话中产生的数据保存在服务器端.
浏览器向服务器发送请求, 服务器接收请求参数, 然后在服务器中检查是否有为当前浏览器服务的 session, 如果有则直接拿来使用, 如果没有则创建一个 session, 并将数据保存在 session 中.
当浏览器再次访问服务器时, 服务器可以找到为当前浏览器服务的 session, 从中取出数据.
每个 session 对应一个 id, 此 id 通过 cookie(临时) 保存在浏览器中, 访问服务器时携带 cookie, 服务器根据这个 id 判断是那个 session.
3. session 域
[生命周期]
创建: 第一次调用 request.getSession() 创建 session 对象.
销毁:
超时死亡: session 默认 30 分钟不适用就会超时销毁. 可以通过 Web.xml 配置超时时间, 单位为分钟.
- <session-config>
- <session-timeout>
- 1
- </session-timeout>
- </session-config>
主动杀死: 可以调用 session.invalidate() 方法, 立刻杀死 session
意外身亡: 当服务器意外关闭时, session 也会销毁. 如果是正常关闭, session 会被钝化, 服务器启动时再活化.
[作用范围]
整个会话
[功能]
在整个会话范围内共享数据
4. 补充
http 协议是无状态的, 当我们在开发一些对状态有需求的接口时, cookie 和 session 弥补了这一块的能力.
来源: https://www.cnblogs.com/juzhuxiaozhu/p/12764786.html