参考文章:https://blog.csdn.net/londa/article/details/94838127
文章目录
http协议是无状态的
web技术发展初期都是静态页面,不需要记住前后两次请求的关系,即http协议是无状态的,前后两次请求没有关联
- 为什么需要会话跟踪技术
现在web动态页面很多时候需要记住之前请求的状态,即需要有状态,比如需求知道用户是否已经进行登录操作,于是出现了维持状态的会话跟踪技术:cookie、session
会话:一次会话包含多次请求和响应
一次会话:浏览器第一次给服务器发送请求,会话建立,直到浏览器关闭或服务器关闭,会话结束
会话技术的主要作用:在一次会话返回内,多次请求之间共享数据
会话技术在java中主要分为两类:
- 客户端会话技术cookie:cookie是将数据保存中浏览器客户端的
- 服务器端会话技术session:session是将数据保存翟服务器端的
浏览器端会话技术Cookie
浏览器客户端第一次请求服务器时,服务器端创建cookie,绑定数据后通过响应发送cookie到浏览器客户端,浏览器收到cookie后存储在本地,下次请求时将cookie又带回服务器
cookie是基于响应头的Set-Cookie属性和请求头Cookie属性实现的
服务器返回cookie详解
服务器创建cookie后返回浏览器客户端时,将cookie的数据放在http请求之响应头的Set-Cookie属性
浏览器传cookie回服务器详解
浏览器传cookie回浏览器时将cookie数据放到http请求之请求头的Cookie属性中,响应头就不会再带cookie信息了
Cookie共享问题
- 同一个域名
一个Tomcat中部署了多个项目,默认情况下cookie不能共享,但可以通过cookie对象的方法进行设置。默认情况下,path为当前项目的虚拟目录,如果要共享,可以设置虚拟目录为 /,所有在根目录下的项目都可以共享cookie
Cookie对象.setPath(String path);
Cookie对象.setPath("/"); //所有在根目录下的项目都可以共享cookie
- 跨域:不同域名之前的cookie共享问题
如果Cookie对象.setDomain(".baidu.com"),那么www.baidu.com、news.baidu.com、music.baidu.com之间即可共享域名,它们都是baidu.com的子域名【切记必须以小数点开头:.baidu.com】
Cookie对象.setDomain(Sring domain)
Cookie的特点
- cookie的数据存在浏览器
- 浏览器对单个cookie的大小有限制,一般为4kb(不同浏览器存在差异),并对同一个域名下cookie的数量也有限制(一般20个以内)
cookie的应用场景:
- 存储少量的不太敏感的数据
- 在不等录的情况下,完成服务器器对客户端身份的识别
Cookie的结构
cookie是以键值对形式存储数据的,但不是Map,一个cookie只能有一个键值对,因为数据是存储在cookie对象的name属性、value属性中的
private final String name;
private String value;
public Cookie(String name, String value) {
validation.validate(name);
this.name = name;
this.value = value;
}
Cookie常见问题
一次可不可以发送多个cookie?
可以,创建时可以同时创建多个cookie,添加到响应中一次返回;请求时,一次也可以带多个cookie返回服务器
cookie在浏览器中保存多久?
(1)默认情况下cookie数据存储在内存中,浏览器关闭后,cookie被销毁
(2)持久化存储【设置过期时间】 cookie对象.setMaxAge(int seconds)
参数为整数:将cookie中的数据持久化存储到硬盘中,指定时间后销毁
参数为负数:cookie数据存储在浏览器内存中,浏览器关闭后cookie数据销毁
参数为0:删除浏览器中的cookie,因为服务器不能直接删除浏览器中cookie,只能通过设置过期时间为0来实现
cookie中可以存储中文吗?
Tomcat8之前cookie中不支持中文,需要将中文转码,一般采用URL编码
Tomcat8及之后版本cookie支持中文,但仍不支持特殊字符,采用URL编码:
//编码
String newStr = URLEncode.encode("字符串","utf-8")
//解码
String newStr = URLDecode.decode("字符串","utf-8")
服务器端会话技术:session
- 在一次会话返回内,多次请求之间共享数据,session的数据是存放在服务器端的
- Session可以存储任意类型、任意大小的数据
Session的创建
session不是一打开网站就会立刻建立,创建session需要满足以下两个条件中的任意一个条件:
(1)后台服务器端调用HttpSession session = request.getSession()进行创建
(2)用户第一次访问jsp页面就会创建session,因为jsp默认会调用session = pageContext.getSession();
//下面两个功能相同,当请求对象中没有session时,会创建session
HttpSession session = request.getSession();
HttpSession session = request.getSession(true);
//下面这个方法,当请求对象中没有session时,返回null,不会创建session
HttpSession session = request.getSession(false);
Session创建后服务器将Session ID 通过Cookie发送到客服端浏览器,而浏览器则将该Session ID 保存在会话Cookie中。当浏览器再次向服务器发送HTTP请求时,会将Session ID 信息一起发送给服务器。服务器根据该Session ID 在服务器内存找到对应的Session对象,即可取出共享数据
session是依赖cookie的,JSessionId通过cookie传递到浏览器,并在浏览器通过cookie的形式存在
Session的销毁
Session销毁有三种情况:
(1)服务器关闭
(2)调用Session对象的invalidate方法
(3)Session对象超过过期时间
默认情况下Session对象30分钟过期
Session常见问题
- 浏览器关闭,服务器不关闭,重新打开浏览器,前后两次获取的Session是否相同?
(1)默认情况下不相同,因为浏览器关闭后cookie被清空,请求后会重新创建cookie
(2)如果需要相同,可以为键为JSESSIONID的Cookie设置过期时间,持久化到磁盘,即可在过期时间内获取到相同的Session - 浏览器 不关闭,服务器关闭,重启服务器后,前后两次获取的Session是否相同?
tomcat服务器关闭后Session对象会被销毁,但tomcat正常关闭后会持久化Session对象到硬盘中,重启时会加载持久化的Session对象,并删除持久化文件。虽然客户端通过相同的JESSIONID前后两次均可获取到Session对象,但Session对象已经不是同一个,不过存储的数据是一致的,只是对象的地址变了
Session和Cookie的区别
(1) Session存储在服务器端,Cookie存储在浏览器端
(2)Session存储无大小限制,Cookie存储数据有大小限制
(3)Session相对Cookie更安全