文章目录
- 会话跟踪技术
- 客户端会话跟踪技术Cookie
- 服务端会话跟踪技术Session
会话跟踪技术
-
会话:客服端和服务端的多次请求与响应称为会话。
-
会话跟踪:服务器需要识别多次请求是否来自同一浏览器,在同一次会话多次请求中共享数据。
HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会视为新的请求,因此需要会话跟踪技术实现数据共享。会话跟踪技术可以分为Cookie和Session。
客户端会话跟踪技术Cookie
- 数据保存在客户端,每次请求都会携带Cookie数据。如上图所示,浏览器向服务端发送第一次请求时,服务端创建一个Cookie存储username及其对应值zs,在响应中添加Cookie传送到浏览器,浏览器存储该Cookie;浏览器向服务端发送第二次请求时,携带所保存的Cookie,服务器通过getCookies()方法得到浏览器中的所有Cookie。
- 具体实现:
// 第一次请求发送Cookie
Cookie cookie = new Cookie(key, value); // 创建Cookie
respones.addCookie(cookie); // 添加Cookie
// 第二次请求获取Cookie,所有cookie都以数组形式返回
Cookie[] cookies = request.getCookies();
// 选择一个cookie,以0为例获取
String name = cookies[0].getName();
String value = cookies[0].getValue();
- Cookie原理:基于HTTP协议
- 响应头 set-cookie 携带设置好的Cooike返回客户端,客户端保存携带的Cookie
- 请求头 cookie 携带客户端存储的Cookie发送请求
- 存活时间:
- 默认情况下,Cookie存储在浏览器内存中,浏览器关闭,Cookie就被销毁
- setMaxAge(int seconds) 设置存活时间
- 正数:Cookie写入电脑硬盘,到时间自动删除
- 负数:默认值,浏览器关闭,Cookie被销毁
- 0:删除对应Cookie
服务端会话跟踪技术Session
- 数据保存在服务端。如上图所示,浏览器向服务器发送第一次请求时,服务器通过session的setAttribute()方法保存键值对;第二次发送请求时,由于是同一会话,服务器取得的和第一次相同的session,通过getAttribute()方法得到对应键值对。两次请求服务端是怎么确定是同一会话?因为第一次请求时,服务端将session的id保存为Cookie传送到浏览器,浏览器保存这次会话的session id,第二次请求时,携带第一次请求的session id,服务端通过session id得到与第一次相同的session,保证了两次请求获取的是同一个session。
- 基本使用:
// 获取Session
HttpSession session = request.getSession();
// 设置session
session.setAttribute(key, value);
// 得到session
session.getAttribute(key);
// 删除session
session.removeAttribute(key);
-
Session原理:
- 基于Cookie
- 如何保证一次会话多次请求是同一个Session?
Session id(JSESSIONID)被存储为Cookie保存在客户端,下一次请求根据携带的Cookie中的JSESSIONID查找对应Session。
-
使用细节:
- Session钝化、活化
- 钝化:服务器正常关闭后,Tomcat会自动将数据写入硬盘的文件中
- 活化:再次启动服务器后,从文件中加载数据到Session中
(咱理解成三体人脱水、浸泡吧)
- Session销毁
- 默认30分钟销毁
- session. Invalidate(); 自己销毁
- Session钝化、活化