Cookie和Session


前言

之前学习servlet的时候有部分是讲会话跟踪技术cookie和session的,但是好久不看就又忘了,而且最开始学习的时候理解的也比较浅,没有理解的东西就更难记住了,逐渐看了跟多新的东西,感觉不断补充知识的过程也是对之前一些知识点的加深理解,所以赶快整理一下,以便后续查阅和补充


一、Cookie

1.什么是Cookie:

网页之间的交互是通过HTTP协议传输数据的,⽽Http协议是⽆状态的协议。⼀旦数据提交完后,浏览器和服务器的连接就会关闭,再次交互的时候需要重新建⽴新的连接。

服务器⽆法确认⽤户的信息,于是乎,W3C就提出了:给每⼀个⽤户都发⼀个通⾏证,⽆论谁访问的时候都需要携带通⾏证,这样服务器就可以从通⾏证上确认⽤户的信息。通⾏证就是Cookie

Cookie存储方式类似于Map集合
在这里插入图片描述
内部可以储存很多不同含义的信息,比如登陆时间time,商品浏览记录history之类的信息,webapp在设计的时候可以根据提供的服务在Cookie中存储相关信息,然后颁发给浏览器,用户在访问的时候,浏览器携带Cookie给服务器,再做后续信息处理。

2.Cookie的流程:

浏览器访问服务器,如果服务器需要记录该⽤户的状态,就使⽤response向浏览器发送⼀个Cookie,浏览器会把Cookie保存起来。当浏览器再次访问服务器的时候,浏览器会把请求的⽹址连同Cookie⼀同交给服务器。
客户->浏览器->服务器

3.Cookie具有不可跨域名性

浏览器判断⼀个⽹站是否能操作另⼀个⽹站的Cookie的依据是域名。所以⼀般来说,当我访问baidu的时候,浏览器只会把baidu颁发的Cookie带过去,⽽不会带上google的Cookie。

二、Session

1.什么是Session

Session是另⼀种记录浏览器状态的机制。不同的是Cookie保存在浏览器中,Session保存在服务器中。⽤户使⽤浏览器访问服务器的时候,服务器把⽤户的信息以某种的形式记录在服务器,这就是Session。

如果说Cookie是检查⽤户身上的”通⾏证“来确认⽤户的身份,那么Session就是通过检查服务器上的”客户明细表“来确认⽤户的身份的。Session相当于在服务器中建⽴了⼀份“客户明细表”。

Session⽐Cookie使⽤⽅便,Session可以解决Cookie解决不了的事情【Session可以存储对象,Cookie只能存储字符串。】

2.Session也是⼀个域对象。

Session作为⼀种记录浏览器状态的机制,只要Session对象没有被销毁,Servlet之间就可以通过Session对象实现通讯。

当我们要存进的是⽤户级别的数据就⽤Session,⽤户级别:只要浏览器不关闭,希望数据还在,就使⽤Session来保存。

3.Session的生命周期和有效期

Session在⽤户第⼀次访问服务器Servlet,jsp等动态资源就会被⾃动创建,Session对象保存在内存⾥,可以直接使⽤request对象获取得到Session对象。如果访问HTML,IMAGE等静态资源Session不会被创建。

Session⽣成后,只要⽤户继续访问,服务器就会更新Session的最后访问时间,⽆论是否对Session进⾏读写,服务器都会认为Session活跃了⼀次。由于会有越来越多的⽤户访问服务器,因此Session也会越来越多。为了防⽌内存溢出,服务器会把⻓时间没有活跃的Session从内存中删除,这个时间也就是Session的超时时间。Session的超时时间默认是30分钟

4.Session的实现原理

服务器是如何实现⼀个session为⼀个⽤户浏览器服务的?换个说法:为什么服务器能够为不同的⽤户浏览器提供不同session?

HTTP协议是⽆状态的,Session不能依据HTTP连接来判断是否为同⼀个⽤户。于是乎:服务器向⽤户浏览器发送了⼀个名为JESSIONID的Cookie,它的值是Session的id值。其实Session依据Cookie来识别是否是同⼀个⽤户。Session 之所以可以识别不同的⽤户,依靠的就是Cookie

该Cookie是服务器⾃动颁发给浏览器的,不⽤我们⼿⼯创建的。该Cookie的maxAge值默认是-1,也就是说仅当前浏览器使⽤,不将该Cookie存在硬盘中。
当我们访问Servlet1的时候,服务器就会创建⼀个Session对象,执⾏我们的程序代码,并⾃动颁发个Cookie给⽤户浏览器。当我们⽤同⼀个浏览器访问Servlet2的时候,浏览器会把Cookie的值通过http协议带过去给服务器,服务器就知道⽤哪⼀个Session。
⽽当我们使⽤新会话的浏览器访问Servlet2的时候,该新浏览器并没有Cookie,服务器⽆法辨认使⽤哪⼀个Session,所以就获取不到值。

5.禁用Cookie时Session怎么用

浏览器禁用Cookie之后,就不会携带Cookie给服务器了(即使服务器依然会颁发cookie给浏览器)。所以当我们访问servlet1之后再访问servlet2,就会发现浏览器没有传任何Cookie给服务器。因为服务器每次创建的时候都是新的Session,不同Servlet获取到的Session的id号都是不同的

这种情况下如何使用Session:URL地址重写

HttpServletResponse类提供了两个URL地址重写的⽅法:

encodeURL(String url)
encodeRedirectURL(String url)

原则:把Session的属性带过去【传递给】另外⼀个Servlet,都要URL地址重写

在跳转到另一个Servlet的时候,URL地址重写。

url = " …… "
response.sendRedirect(response.encodeURL(url));

URL地址重写的原理
将Session的id信息重写到URL地址中。服务器解析重写后URL,获取Session的id。这样⼀来,即使浏览器禁⽤掉了Cookie,但Session的id通过服务器端传递,还是可以使⽤Session来记录⽤户的状态。

5.Session应用

1.校验码验证

在验证码生成的servlet里面,将随机生成的验证码数字写入session,然后提交表单之后比对提交上来的验证码和session里面存的验证码,若相同则验证通过否则验证码输入错误。

2.防止重复提交表单

这个问题有几种解决方法:1)使用javaScript设置提交事件监听,只让用户提交一次表单。2)使用JavaScript设置按钮隐藏,点击过一次提交按钮之后就让该按钮隐藏,客户就点不到了。

但是对于刷新和后退再提交,JavaScript无法控制。这里可以用Session。

生成一个随机数——token,将token存到session里面
跳转表单提交jsp页面
jsp中在隐藏域里获取session中的token
处理表单提交页面:判断jsp隐藏域是否有值,Session中的值是否为空,Session中的值和jsp隐藏域带过来的值是否相同。

相同->清除Session中的token
不同->请不要重复提交数据

参考:
Servlet第五篇【介绍会话技术、Cookie的API、详解、应用】(修订版)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值