概述
-
会话:用户打开浏览器访问Web服务器资源,会话建立,直到有一方断开连接,会话结束。一次会话可以包含多次请求和响应。
-
会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自同一浏览器,以便在同一次会话的多次请求间共享数据。
一、Cookie
- Cookie:客户端会话跟踪技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问。
- Cookie的工作流程:
A. 浏览器第1次请求服务器,服务器响应的同时附带发送Cookie。
B. 浏览器接收到Cookie和数据,在第2次请求中携带Cookie发送到浏览器。
C. 浏览器就可以通过第2次请求的Cookie来识别客户端。
(一)基本使用
(二)原理
Cookie的实现是基于HTTP协议的:
- 在第1次响应客户端时响应头:set-cookie,通过HTTP协议在响应头里带上Cookie内容响应给客户端。
- 客户端在第2次及以后请求服务端时请求头:cookie,通过HTTP协议在请求头里带上Cookie内容请求服务端。
(三)使用细节
(1)Cookie存活时间
- 默认情况下,Cookie存储在浏览器内存中,当浏览器关闭时,内存释放,Cookie也一并被销毁。
- 可以使用
setMaxAge(int seconds)
设置Cookie存活时间(单位秒)
A. 正数:将Cookie写入浏览器所在设备的硬盘,持久化存储,到时间自动删除。
B. 负数:默认值,Cookie存在内存中,浏览器关闭时就被销毁。
C. 零:删除对应Cookie。
eg:
//响应Cookie,并设置存活时间为一天
Cookie cookie = new Cookie("username", "zhangsan");
cookie.setMaxAge(60*60*24);
response.addCookie(cookie);
(2)Cookie存储中文
- Cookie不能够直接存储中文
- 要存储中文,需要进行转码:使用URL编码(URLEncoder、URLDecoder)
//响应Cookie到客户端,中文编码
String value = "张三";
//URL编码
value = URLEncoder.encode(value,"UTF-8");
Cookie cookie = new Cookie("username", value);
response.addCookie(cookie);
//请求Cookie到服务端,中文解码
Cookie[] cookies = request.getCookies();
for (Cookie cookie1 : cookies) {
String name = cookie1.getName();
String value = cookie1.getValue();
//URL解码
value = URLDecoder.decode(value, "UTF-8");
System.out.println(name + ": " + value);
}
二、Session
- Sesssion:服务端会话跟踪技术,将会话数据存到服务端。
- JavaEE提供了HttpSession接口,来实现一次会话里的多次请求间数据共享功能。
- 工作流程:
在同一个客户端的多次请求里,服务端request.getSession()
获取的都是同一个Session对象。
(一)基本使用
(二)原理
Session的实现是基于Cookie的:
- 在第1次获取Session对象时,Session有一个唯一标识id。
- 当服务端响应客户端时,tomcat发现使用的是session对象,会自动的把Session的唯一标识id当作Cookie响应给客户端set-cookie:JSESSIONID=XXXXXXX。
- 客户端第2次请求服务端时,会携带cookie:JSESSIONID=XXXXX请求服务端,然后服务端会寻找自己有没有id相同的Session对象,有就直接拿来用,没有就新建一个Session对象。
- 通过第三步就保证了客户端的多次请求获取的都是同一个Session对象。
(三)使用细节
(1)Session钝化、活化:
- 服务器重启后,Session中的数据是否还在?答案:在,因为有钝化和活化的存在。
A. 钝化:在服务器正常关闭后,tomcat会自动将Session数据写入硬盘文件中。
B. 活化:再次启动服务器后,从文件中加载数据到Session中。
C. 注意,一定要是服务器正常关闭才能存储到硬盘中 - Session销毁
默认情况下,无操作30分钟后自动销毁(在web.xml的<web-app>
标签中可以自定义这个时间)
<session-config>
<session-timeout>30</session-timeout>
</session-config>
调用Session对象的invalidate()
方法,可以销毁对象(可以用于用户退出登录功能)
区别
相同:Cookie和Session都是用来完成一次会话内多次请求间的数据共享。
不同:
片面的一句话总结:保存用户未登录时的信息用Cookie,用户登录后的信息用Session。