会话跟踪技术
一、术语介绍
1.会话
用户打开浏览器,第一次访问web服务器的资源,会话建立;直到有任一方断开连接,会话结束。一次会话中可以包含多次请求和响应。
【tips】“会话”指的是浏览器和服务器之间建立会话。
2.会话跟踪
会话跟踪是一种维护浏览器状态的方法,web服务器需要识别多次请求是否来自于同一浏览器(会话跟踪),以便在同一次会话中的多次请求间共享数据。
3.为什么需要会话跟踪技术?(★)
因为HTTP协议是无状态的,每次浏览器发送请求时,服务器都会将其视为新请求,因此需要会话跟踪技术来实现会话内数据共享。
4.会话跟踪的实现方式
(1)客户端会话跟踪技术:Cookie
(2)服务器会话跟踪技术:Session
【tips】cookie和session都写在servlet中,发送和获取是写在两个servlet中。
二、Cookie
Cookie:将数据保存到浏览器,以后的每次请求都携带Cookie数据进行访问。
1.Cookie基本使用
(1)服务器向客户端发送Cookie
1)创建Cookie对象,设置数据
Cookie cookie = new Cookie("username", "zhangsan");
2)发送Cookie到客户端(浏览器),即将Cookie数据存到response对象中
void response.addCookie(Cookie cookie); |
将Cookie数据存到response对象中 |
response.addCookie(cookie);
(2)服务器从客户端获取Cookie
1)使用request对象获取客户端携带的所有Cookie
Cookie[] cookies = request.getCookies();
2)for循环遍历Cookie数组,获取每一个Cookie对象
3)使用Cookie对象方法获取数据
for (Cookie cookie : cookies) { String name = cookie.getName(); if (name.equals("username")) { String value = cookie.getValue(); System.out.println(name + ":" + value); break; } }
2.Cookie的原理
Cookie的实现是基于HTTP协议的:服务器向浏览器发送Cookie时,会在响应数据的响应头中添加一个Set-Cookie键;服务器从浏览器中获取Cookie时,浏览器会在请求数据的请求头中加一个Cookie键。
(1)发送Cookie:
(2)获取Cookie:
3.Cookie的生命周期
(1)默认情况下,Cookie存储在浏览器的内存中,一旦浏览器关闭,内存释放,Cookie就随之销毁了。
(2)(★)用Cookie对象的setMaxAge()设置Cookie数据的存在时间(创建后发送前设置存活时间):
public void setMaxAge(int seconds) |
设置Cookie数据的存在时间。
|
4.Cookie存储中文问题
Cookie不能直接存储中文。那么如何实现Cookie存储中文?
发送Cookie数据时,将中文数据进行URL编码;获取Cookie时,再进行URL解码。
(1)URL编码(URLEncoder.encode(String 待编码数据,StandardCharsets.UTF_8))
String name = "张三"; //URL编码 String value = URLEncoder.encode(name, StandardCharsets.UTF_8);(2)URL解码(URLDecoder.decode(String 待解码数据,StandardCharsets.UTF_8))
String name = cookie.getName(); if (name.equals("username")) { String value = cookie.getValue(); //URL解码 value = URLDecoder.decode(value, StandardCharsets.UTF_8); System.out.println(name + ":" + value); break; }
三、Session
Session:将数据保存到服务器。
1.Session基本使用
JavaEE提供HttpSession接口(★),来实现一次会话的多次请求间的数据共享。
request方法 | 说明 |
HttpSession getSession(); |
获取Session对象 |
void setAttribute(String keyName,Object o) | 将数据o存到Session域的keyName中 |
Object getAttribute(String keyName) | 根据key获取值 |
(1)向Session中存储数据:
1)使用request对象获取Session对象:
HttpSession session = request.getSession();
2)向Session中添加数据:
session.setAttribute("username", "zhangsan");
(2)从Session中获取数据:
1)使用request对象获取Session对象:
HttpSession session = request.getSession();
2)从Session中获取数据:
Object username = session.getAttribute("username");
2.Session的原理
Session是基于Cookie实现的:当客户端访问服务器时,如果服务器启用Session,服务器就要为该客户端创建一个Session,创建时,服务器先检查这个客户端发来的请求数据里的Cookie请求头是否包含了一个Session_id,如果包含了则说明之前该客户端已经访问过服务器,那服务器根据Session_id找到对应的Session;如果不包含则为该客户端创建一个Session,并生成一个对应的Session_id,该Session_id将写在本次响应数据中的Set-Cookie响应头中,返回到客户端保存。
(1)请求数据Cookie请求头中的Session_id:
(2)响应数据Set-Cookie响应头中的Session_id:
3.Session的钝化、活化
服务器重启后,Session中的数据仍然存在。
(1)钝化:在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件中。
(2)活化:再次启动服务器后,从硬盘的文件中加载数据到Session。
4.Session的销毁
(1)自动销毁:默认情况下,无操作30分钟后Session自动销毁。可在web.xml中配置自动销毁的时间:
<session-config> <!--Session将在无操作100分钟后自动销毁--> <session-timeout>100</session-timeout> </session-config>(2)手动销毁:调用Session对象的invalidate()方法来销毁该Session对象。
四、Cookie和Session的比较(★)
|
Cookie | Session |
存储位置 | 将数据存储在客户端 | 将数据存储在服务器 |
安全性 | 不安全 | 安全 |
数据大小 | 最大3KB | 无限制 |
存储时间 | 可长期存储 |
默认30min
|
服务器性能 | 存储在客户端,不占用服务器资源 | 占用服务器资源 |