一、会话跟踪技术
会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应
会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据
HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现会话内数据共享(为什么设置成为无状态的?因为设成无状态的就不用携带前面的数据,访问速度会快些。)
实现方式:
1.客户端会话跟踪技术:Cookie(也就是把请求数据放到了客户端服务器里)
2.服务端会话跟踪技术:session
二、Cookie
(一)cookie的工作流程和Cookie基本使用
Cookie:客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访
cookie的工作流程:比如服务器有两个资源A servlet 和Bservlet,这时,客户端浏览器发送请求1来请求Aservlet ,这时Aservlet 里创建一个cookie对象的数据,Aservlet 发送响应的时候把cookie发给客户端浏览器,浏览器接收到后保存在浏览器里,浏览器在同一次会话中,再次发送请求Bservlet这时浏览器携带cookie的内容访问Bservlet,在Bservlet里就能获取到数据。
我们作为后台人员,更关注服务端的操作;所以对于服务端人员来说主要分为两个:发送cookie和获取cookie
Cookie基本使用:
测试举例:在AServlet里写下面代码
在BServlet里写下面代码
浏览器开两个窗口进行访问
(二)cookie的原理
cookie的实现是基于http协议的
浏览器发送请求访问A servlet,tomcat做出响应时发现是A servlet要发送cookie数据,就会在响应发送的数据里加上set -cookie响应头,浏览器接收到响应头,发现是cookie,就把对应的响应头解析,拿到数据,把数据存在浏览器内存里,浏览器下一次携带cookie数据访问B servlet,这时,浏览器给数据加上请求头cookie,携带着访问B servlet,这时B servlet会获取到对应的请求头的数据再通过request对象把所有的数据防止成cookie对象。
(三)cookie使用细节
cookie的存活时间:
默认情况下,cookie存储在浏览器内存中,当浏览器关闭,内存释放,则Cookie被销毁
可以用setMaxAge(int seconds)来设置cookie的存活时间
正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储,到时间自动删除
负数:默认值,cookie在当前浏览器内存中,浏览器关闭,cookie被销毁
零:删除对应的cookie
cookie存储中文问题
cookie不能直接存储中文,如果要存储要进行转码:URL编码
解码:
三、session
(一)基本使用
服务端会话跟踪技术:将数据保存到服务端
JavaEE提供HttpSesion接口,来实现一次会话的多次请求见数据共享功能
(二)session的原理
session是基于cookie实现的
一次会话的多次请求间,不管获取多少次,都获取的是同一个session
服务器如何保证在一个会话的多次请求间获取到的session是同一个?
通过demo1获取session第一次执行时,获取出的session有一个唯一标识id10,这时demo1存别的数据,存完后,tomcat给对应的客户端浏览器做出响应,这时tomcat发现用了session,会自动将session的id当作一个cookie发送给客户端浏览器,会加上响应头set-cookie(JSESSIONID=10)给浏览器,浏览器收到后把收到的存储在浏览器内存里,浏览器下一次再携带着cookie信息去访问demo2的servlet,访问的时候会携带cookie头(JSESSIONID=10);demo2里获取session的时候,发现携带的是cookie头,cookie头里面还有JSESSIONID=10,第二次获取的时候,就会去内存中找有没有ID=10的session,如果有就直接用,如果没有就创建新的,这样就保证了同一会话获取到同一个session。
(三)session的使用细节
一般会把登录之后的信息存在session中
session不能长期的存储数据,浏览器关闭后再打开,获取到的session不是同一个
session要想共享一些数据,就要保证浏览器不被关闭;而cookie可以存在硬盘中长期存储
session的钝化、活化:
服务器重启后,Session中的数据是否还在?
钝化:在服务器正常关闭后,tomcat会自动将 Session数据写入硬盘的文件中
活化:再次启动服务器后,从文件中加载数据到Session中
session的销毁:
调用session.invalidate()方法销毁session可以用在登录后推退出登录时。
四、小结
cookie和session都是来完成一次会话内多次请求间数据共享的
区别:
使用场景:
购物车一般用cookie,要长期存储
登录要保证安全,一般用session
验证码要保证安全,一般用session