会话技术
会话:
一次会话中包含多次请求和响应。
客户端浏览器访问服务器的资源,只要客户端或者服务器端不关闭,这始终在一次会话范围内,这一次会话范围内可以包含多次请求并且收到多次相应。
一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止。
功能
在一次会话的范围内的多次请求间,共享数据。
解释:
http协议是无状态的,无状态:客户端发送了多次请求,服务器给力我多次响应,每次请求响应和其他请求响应是相互独立的,他们之间并不能进行数据的交流和交换,我们想进行数据的交流和交换怎么办,只能使用会话技术解决。
举例演示:
京东每次加入购物车都是一次请求,最后购物车结算可以汇集这些请求结果算出总金额。
方式
客户端会话技术(把数据存在客户端的):cookie
服务器端会话技术(把数据存在服务端的):session
cookie
概念:
客户端会话技术,将数据保存在客户端。
解释:
第一次请求服务器请求完成,服务器会携带一些数据响应给浏览器,浏览器把这些数据保存在浏览器本地,下一次请求,他会把这些数据带着发送给服务器。
快速入门
使用步骤:
1)创建cookie对象(cooike是一个类),绑定数据
new Cookie(String name,String value)
2)发送cookie对象
要通过响应去发,应该找response对象的API:
response.addCookie(Cookie cookie)
接收cookie对象,上面new的加进去,相当于通过response发送cookie给浏览器,浏览器收到cookie后会存储,下一次会自动带着cookie去请求,我们就可以再一次获取cookie了。
3)获取cookie 拿到数据
获取肯定是在请求里携带,应该找request的API
因为可能会有多个cookie的存在,这里返回是cookie数组
Cookie[] = request.getCookies()
拿到所有cookie,遍历打印获取1)带过去的数据。
代码演示
cookie原理
基于响应头set-cookie和请求头cookie实现
解释说明
不管发送cookie还是获取cookie对象,最终他们体现形式都是以http的协议在进行数据的交互,一定是底层通过http协议的响应和请求来完成的。
response会给弄个响应头set-cookie:msg=hello
浏览器发现有这么一个响应头,http协议里面响应头规定了,如果浏览器收到一个setCookie头,浏览器会自动干一件事,会将这个头里面携带的数据msg =hello 保存在客户端浏览器中,并且下一次再次发送请求,浏览器会将这个数据带过去。
带过去:
浏览器请求时,在请求的消息头里面弄个请求头:cookie:msg=hello
在服务器这边,可以写代码获取请求头里面的数据,只不过我们使用的是java web给我们封装好的API来做的这么一个操作,不需要我们自己再去单独针对这个请求头操作了。
所以服务器,http协议,浏览器帮我们做了很多的事,我们要关注的非常少,只需要通过API发送和获取cookie。
通过抓包来看
cookie细节
cookie一些操作规则和一些cookie常用的API。
一次可不可以发送多个cookie
可以。可以创建多个cookie对象,使用response调用多次addCOokie方法发送cookie即可。
发送时:创建两个对象,response.add两次
响应头:两个
set-cookie:msg=zhangsan
set-cookie: name=zhangsan
请求头:用逗号隔开
cookie:msg=hello,name=zhangsan
注意⚠️:只要有一个response带上cookie,浏览器存储了之后,浏览器再访问任何一个服务器路径都会带上cookie。不是说传过来的那个路径访问就不带了。
cookie在浏览器中保存多长时间
1)默认情况下,当浏览器关闭后,cookie数据被销毁。
相当于cookie信息保存在浏览器的内存里,浏览器关了内存被释放了,cookie数据也就没了。
演示:
访问demo1,cookie信息存到浏览器,再访问demo2,服务器会获取到cookie信息。
这时候给浏览器关闭,再去直接访问demo2,服务器获取不到cookie信息了。
2)通过设置cookie的生命周期让cookie持久化存储:
通过cookie对象的方法:setMaxAge(int second )
传正数:将cookie数据写到硬盘的文件中,持久化存储。second秒数是cookie的存活时间,到这个时间后,cookie文件会被自动删除掉。
传负数:默认值,浏览器内存里,浏览器关闭就没了。
传零:代表删除cookie信息,因为服务器不能直接操作用户电脑上的数据,只有通过这种方式把cookie删除掉。
我们经常希望浏览器关闭也可以保存下来,内存中数据怎么保存下来:
在硬盘上文件里的数据可以被持久化存储。
演示:
3)cookie能不能存储中文数据?
tomcat8之前不能直接存储中文数据,会报错。需要将中文数据转码,一般采用url编码。
tomcat8之后,支持存储中文数据。