黑马讲得比较详细
一.什么是session
==Session==:服务端会话跟踪技术:将数据保存到服务端。
除了使用Cookie一种方法,Web应用程序中还经常使用第二种方法Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。
1、用户向服务器发送用户名和密码
2、服务器通过验证后,会在当前会话(session)里面保存相关数据,比如用户角色,登陆时间等;
3、服务器会通过Response Header的Set-Cookie向用户返回一个sessionId,客户端存入Cookie中
4、用户随后的每一次请求,都会通过Request Header的Cookie,将sessionId发送给服务器
5、服务器收到 sessionId 后,找到之前保存下来的数据,由此得知用户身份
注意点:
- 存储位置:服务器中(磁盘文件或数据库里面)
- 因为保存在服务端,所以相对于保存在客户端的cookie来说更加安全了
Session是存在于服务器端的。当浏览器第一次发送请求时,服务器自动生成一个Session和一个Session ID作为账号,并通过响应发送到服务器。浏览器第二次发送请求的时候,就可以直接找到相对应的Seesion(但是一旦服务器关闭过了,那么先前所有的Session都会被销毁)
二.session方法
session.setAttribute(String name, Object obj) //将信息保存在session范围内
session.getAttribute(String name) //获取保存在session范围内的信息
session.getAttributeNames(); //返回Session对象中存储的每一个属性对象,枚举型
session.isNew() //判断session对象是不是新的
getCreationTime(); //返回Session被创建的时间.单位毫秒
invalidate(); //设置session无效,一般用在[安全退出]
removeAttribute("key"); //删除属性
黑马的笔记
Session的使用细节
Session钝化与活化
服务器重启后,Session中的数据是否还在?
(1)服务器端AServlet和BServlet共用的session对象应该是存储在服务器的内存中
(2)服务器重新启动后,内存中的数据应该是已经被释放,对象也应该都销毁了
所以session数据应该也已经不存在了。但是如果session不存在会引发什么问题呢?
举个例子说明下,
(1)用户把需要购买的商品添加到购物车,因为要实现同一个会话多次请求数据共享,所以假设把数据存入Session对象中
(2)用户正要付钱的时候接到一个电话,付钱的动作就搁浅了
(3)正在用户打电话的时候,购物网站因为某些原因需要重启
(4)重启后session数据被销毁,购物车中的商品信息也就会随之而消失
(5)用户想再次发起支付,就会出为问题
所以说对于session的数据,我们应该做到就算服务器重启了,也应该能把数据保存下来才对。
分析了这么多,那么Tomcat服务器在重启的时候,session数据到底会不会保存以及是如何保存的
只要服务器是正常关闭和启动,session中的数据是可以被保存下来的。
那如何才是正常关闭Tomcat服务器呢?
需要使用命令行的方式来启动和停止Tomcat服务器
==启动==:进入到项目pom.xml所在目录,执行 mvntomcat7:run
==停止==:在启动的命令行界面,输入ctrl+c
那么Tomcat服务器到底是如何做到的呢?
具体的原因就是:Session的钝化和活化:
钝化:在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件中
活化:再次启动服务器后,从文件中加载数据到Session中
三.什么是Cookie
客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问。
2.Cookie的工作流程
生于服务器 存于客户端
第一种讲解 来源于存储方式详解(cookie、session、Token)_鹏鱼雁的博客-CSDN博客_cookie的存储形式
Cookie实际上是一小段的文本信息。(第一次)客户端请求服务器,如果服务器需要记录该用户状态,就使用Response Header(响应头)的Set-Cookie向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来(自动保存起来了,不用手动保存)。(第二次)当浏览器再请求该网站时,浏览器通过Request Header(请求头)的Cookie把请求的网址连同该Cookie一同提交给服务器(也是自动带上的cookie的)。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
第二种讲解来源于黑马笔记
-
服务端提供了两个Servlet,分别是ServletA和ServletB
-
浏览器发送HTTP请求1给服务端,服务端ServletA接收请求并进行业务处理
-
服务端ServletA在处理的过程中可以创建一个Cookie对象并将
name=zs
的数据存入Cookie -
服务端ServletA在响应数据的时候,会把Cookie对象响应给浏览器
-
浏览器接收到响应数据,会把Cookie对象中的数据存储在浏览器内存中,此时浏览器和服务端就==建立了一次会话==
-
==在同一次会话==中浏览器再次发送HTTP请求2给服务端ServletB,浏览器会携带Cookie对象中的所有数据
-
ServletB接收到请求和数据后,就可以获取到存储在Cookie对象中的数据,这样同一个会话中的多次请求之间就实现了数据共享
Cookie的原理分析
对于Cookie的实现原理是基于HTTP协议的,其中设计到HTTP协议中的两个请求头信息:
-
响应头:set-cookie
-
请求头: cookie
AServlet给前端发送Cookie,BServlet从request中获取Cookie的功能
-
对于AServlet响应数据的时候,Tomcat服务器都是基于HTTP协议来响应数据
-
当Tomcat发现后端要返回的是一个Cookie对象之后,Tomcat就会在响应头中添加一行数据==
Set-Cookie:username=zs
== -
浏览器获取到响应结果后,从响应头中就可以获取到
Set-Cookie
对应值username=zs
,并将数据存储在浏览器的内存中 -
浏览器再次发送请求给BServlet的时候,浏览器会自动在请求头中添加==
Cookie: username=zs
==发送给服务端BServlet -
Request对象会把请求头中cookie对应的值封装成一个个Cookie对象,最终形成一个数组
-
BServlet通过Request对象获取到Cookie[]后,就可以从中获取自己需要的数据
Cookie的使用细节
第一个是Cookie的存活时间,第二个是Cookie如何存储中文,首先来学习下Cookie的存活时间。
Cookie的存活时间
默认情况下,Cookie存储在浏览器内存中,当浏览器关闭,内存释放,则Cookie被销毁
所以我们现在就遇到一个难题是如何将Cookie持久化存储?
设置Cookie存活时间 setMaxAge(int seconds)
Cookie存储中文
如果需要存储中文,就需要进行转码,具体的实现思路为:
1.在AServlet中对中文进行URL编码,采用URLEncoder.encode(),将编码后的值存入Cookie中
2.在BServlet中获取Cookie中的值,获取的值为URL编码后的值
3.将获取的值在进行URL解码,采用URLDecoder.decode(),就可以获取到对应的中文值
//对中文进行URL编码
value = URLEncoder.encode(value, "UTF-8");
System.out.println("存储数据:"+value);
Cookie是存在于客户端的。Cookie的数据不是发送到服务器,而是保存在浏览器当中,如果你没有设置存活时间,那么在你重启浏览器后,你的Cookie是不会保存的。相比于Session来说,Cookie不会占用电脑的运行内存,存储的数据大小也比Session要小,安全性也小于Session。但是一般的自动登录,就是由Cookie来实现完成的。
cookie和session区别
存储位置不同:cookie存储在客户端(cookie生于服务端 存于客户端),session存储在服务端
存储容量不同:cookie最多能保存4KB的数据,session来说没有上限,所以高并发时,session会很耗服务器资源
存储方式不同:cookie只能保存ASCLL字符串,session能够保存任何类型的数据
安全性:cookie对客户是可见的,可能会被伪造,session存储在客户端的,相对安全
有效期不同:cookie可以手动设置有效时间,session在关闭会话窗口之后就会丢失失效
黑马笔记
Cookie和Session小结
-
Cookie 和 Session 都是来完成一次会话内多次请求间==数据共享==的。
所需两个对象放在一块,就需要思考:
Cookie和Session的区别是什么?
Cookie和Session的应用场景分别是什么?
-
区别:
-
存储位置:Cookie 是将数据存储在客户端,Session 将数据存储在服务端
-
安全性:Cookie不安全,Session安全
-
数据大小:Cookie最大3KB,Session无大小限制
-
存储时间:Cookie可以通过setMaxAge()长期存储,Session默认30分钟
-
服务器性能:Cookie不占服务器资源,Session占用服务器资源
-
-
应用场景:
-
购物车:使用Cookie来存储
-
以登录用户的名称展示:使用Session来存储
-
记住我功能:使用Cookie来存储
-
验证码:使用session来存储
-
-
结论
-
Cookie是用来保证用户在未登录情况下的身份识别
-
Session是用来保存用户登录后的数据
-
介绍完Cookie和Session以后,具体用哪个还是需要根据具体的业务进行具体分析。