JavaWeb会话机制Cookie和Session
- 什么是会话机制
- 常用会话跟踪技术
-
- Cookie
-
- 工作流程
- 操作
- 有效期
- Cookie路径
- 特点
- 应用
- Session
-
- 原理
- 操作
- 有效期
- SESSIONID的URL重写
- 应用
什么是会话机制
用来跟踪用户的整个会话
-
一次会话
指浏览器给服务器发送请求访问web程序,该次会话就已接通,其中不管浏览器发送多少请求都视为一次会话,直到浏览器关闭,本次会话结束
常用会话跟踪技术
- Cookie通过在客户端记录信息确定用户身份
- Session通过在服务端记录信息确定用户身份
Cookie
工作流程
- 客户端发送请求到服务器
- 服务器servlet创建cookie,保存少量数据,发送响应到客户端,其中包括Set-Cookie头部
- 浏览器获得服务器发送的cookie数据并自动保存到浏览器端
- 浏览器再次访问时,发送包含Cookie头部的请求,自动携带cookie数据
操作
-
创建
由服务器创建:
一旦cookie创建好了,就不能在往其中增加别的键值对,但是可以修改其中的内容:Cookie cookie = new Cookie(key,value);
cookie.setValue();
- 发送到浏览器
addCookie(Cookie);
-
servlet接收cookie
接收到浏览器发送的所有cookie:
getCookies();
有效期
- 默认:关闭浏览器cookie失效
- 手动设置:
参数expiry:cookie.setMaxAge(expiry);
- 等于-1(默认):浏览器关闭后即会话结束后,cookie失效
- 大于0:浏览器关闭后cookie不会失效,并保存在硬盘中,直到设置时间过期才会被浏览器自动删除
- 等于0:删除cookie
Cookie路径
可以设置服务器端获取cookie的访问路径,并非服务器端web项目中所有的servlet都能访问该cookie
- 默认路径:当前访问的servlet父路径
- 修改cookie的访问路径:
setPath("/test01/"); // 在test01项目下任何位置都能获取到cookie
特点
- 一个web站点(项目)最多发送20个cookie
- 一个浏览器最多保存300个cookie
- cookie不安全,可能泄露用户信息。浏览器支持禁用cookie
应用
- 记住用户名
- 历史记录
Session
在服务器端来保持状态,用于共享数据技术
原理
浏览器请求服务器访问web站点时,服务器会先检查这个客户端请求是否包含SESSIONID:
- 如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用
- 如果不包含,则服务器为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值是一个不重复又不容易被找到规律以仿造的字符串,session id将在本次响应中返回到客户端保存,客户端可以用cookie保存,之后浏览器可以自动的按照规则把这个标识发回给服务器
Servlet容器负责创建HttpSession对象
操作
- session的获取
-
request.getSession()
如果没有将创建一个新的,等效getSession(true);
-
request.getSession(boolean)
true:没有将创建;false:没有将返回null
-
- 信息的存储和获取
- 存储:
setAttrubute(key,value);
- 获取:
getAttribute(key);
- 存储:
有效期
-
销毁
session不会随着浏览器的关闭而死亡,而是等待超时时间,默认超时时间为30分钟
-
立即销毁session对象session.invalidate()
- 超过默认有效时间30分钟
- 超过有效期设置时间
- 服务器非正常关闭(如果服务器正常关闭,session就会被持久化(写入到文件中,等默认超时时间30分钟过后,就会被删除)
-
- 有效期设置
-
设置有效时间,单位秒setMaxInactiveInterval(int interval)
- 在web.xml中配置session的有效时间,单位:分钟
有效期过后HttpSessionListener中的<session-config> <session-timeout>30</session-timeout> <session-config> // 若值为负数或0则为不限制session失效时间
方法将被调用,销毁Session会话sessionDestroyed()
-
SESSIONID的URL重写
-
问题
当浏览器将cookie禁用时用cookie保存的session不能正常工作,每次使用request.getSession()都将创建一个新的session,达不到session共享数据的目的
-
解决
通过URL将session id传递给服务器,即URL重写
- 手动设置:
url;jsessionid=....
- API方式
- 所有URL重写:
encodeURL(java.lang.String url)
- 重定向URL重写:
encodeRedirectURL(java.lang.String url)
- 所有URL重写:
- 手动设置:
应用
- 当前用户的登录状态
- 发送给浏览器的验证码信息,且需要在服务器端进行验证
参考:https://www.cnblogs.com/whgk/p/6422391.html