什么是会话
image-20221019192550392.png- 用户打开浏览器,访问服务器的某个资源,就会建立会话,直到有一方断开连接,例如浏览器关闭,服务器重启等,就会会话结束。一次会话中可以包含多次请求和响应。
问题
由于Http是无状态的,无论浏览器发送多少次请求,服务器都会将该请求当成一个新的请求,所以需要使用会话跟踪技术来解决这个问题。
Cookie和Session
- Cookie:客户端会话跟踪技术
- Session:服务端会话跟踪技术
Cookie
image-20221019192900673.png- Cookie,客户端会话跟踪技术,将数据保存到浏览器,以后每次请求都带上Cookie数据进行访问
Cookie的基本使用
- 发送Cookie
浏览器发送请求到服务端,服务端将Cookie发送给浏览器
//创建Cookie
Cookie cookie = new Cookie("key", "value");
//发送Cookie
response.addCookie(cookie);
- 获取Cookie
后续浏览器的每次请求,都会带上Cookie数据,那么服务端就可以从请求中获取Cookie数据,
//获取Cookie数组
Cookie[] cookies = request.getCookies();
//遍历每个Cookie,获取每个Cookie的键和值
for (Cookie cookie : cookies) {
//Cookie的键
String name = cookie.getName();
//Cookie的值
String value = cookie.getValue();
System.out.println("Cookie key=" + name + ",value=" + value);
}
Cookie的原理
Cookie是基于HTTP协议实现的
- 浏览器请求服务端,服务端生成Cookie,并在响应头中设置响应头:
set-cookie
- 浏览器从响应头中获取Cookie,在后续的请求中,都设置一个
cookie
请求头,传递给服务端获取
在浏览器中,查看Cookie
image-20221019193318254.pngCookie使用细节
Cookie的存活时间
默认情况下,Cookie存储在浏览器内存中,当浏览器关闭,Cookie就会销毁,但也可以设置Cookie的存活时间,来控制Cookie存活
- cookie.setMaxAge(int seconds);,传入的参数为存活时间,单位为秒
- 正数,代表Cookie将持久化存储在浏览器所在的磁盘中,到期自动删除
- 负数,默认值,代表Cookie将存储在浏览器的内存中,关闭浏览器则销毁
- 零,设置Cookie立即过期
Cookie存储问题
- 如需要在 Cookie 空格或中文,需要进行URL编码
- Tomcat-7 Cookie 不能直接存储中文,Tomcat8 则可以存储中文,但不能存储空格
- 所以需要存储空格或中文,都需要进行URL编码,获取时进行URL解码
String name = "张 三";
//URL编码
name = URLEncoder.encode(name, "UTF-8");
//创建Cookie
Cookie cookie = new Cookie("name", name);
//发送Cookie
response.addCookie(cookie);
//获取Cookie
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
//Cookie的键
String name = cookie.getName();
//Cookie的值
String value = cookie.getValue();
//URL解码,可能会存在空格和中文
value = URLDecoder.decode(value, "UTF-8");
System.out.println("Cookie key=" + name + ",value=" + value);
}
Session
- Session,服务端会话技术,将数据保存到服务器
- JavaEE 提供 HttpSession接口,来实现一次会话的多次请求间数据共享功能
Session的使用
//获取Session
HttpSession session = request.getSession();
//存储数据到Session
session.setAttribute("sname", "lisi");
//从Session中获取数据
Object sname = session.getAttribute("sname");
//删除Session指定名称的数据
session.removeAttribute("sname");
Session的原理
Session基于Cookie实现的
image-20221019193840691.png- 浏览器发出请求到服务端,服务端创建Session,并且把Session的Id,JSESSIONID返回给浏览器,浏览器将id存储到Cookie中
- 浏览器后续发出的请求,都会将这个JSESSIONID,通过Cookie发送给服务端,服务端根据这个id获取Session对象,通过对象获取数据
Session的使用细节
-
服务器重启后,Session中数据是否还存在?
- 钝化,服务器关闭后,Tomcat会自动将Session数据持久化到磁盘中
- 活化,服务器再次启动,Tomcat会将磁盘中的Sessions数据恢复
-
注意:
- 如果是IDEA中集成Tomcat需要勾选配置 Preserve sessions across restarts and redeploys
-
如果是直接部署到Linux系统上,则不需要进行配置,Tomcat会默认开启钝化和活化
-
Session的销毁
- 默认,30分钟无操作,Session将会被自动销毁,如需更改,则要在web.xml中进行配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- session的最大存活时间,单位为分钟,默认为30分钟 -->
<session-config>
<session-timeout>5</session-timeout>
</session-config>
</web-app>
Cookie和Session的对象
- 相同点
- Cookie和Session,都是在同一个会话中,用来进行多个请求间的数据共享的
- 区别
- 键值对数量:一个Cookie对象只能保存一个键和一个值,而Session可以保存多个键和多个值
- 存储位置,Cookie存储在客户端,Session存储在服务端
- 安全性:Cookie不安全,Session安全
- 数据大小:Cookie最大4kb,Session没有大小限制
- 存储时间:Cookie默认浏览器关闭则销毁,Session默认30分钟无操作则过期
- 是否占用服务器资源:Cookie不占用服务端资源,Session占用服务端资源
网友评论