Marco's Java 之【Session&Cookie】

探讨了HTTP无状态协议下,如何通过Session和Cookie技术保持客户端与服务器间的会话状态。Session依赖于Cookie,用于服务器端存储用户数据,而Cookie保存在客户端,用于跟踪用户状态。

Session&Cookie

前言

由于HTTP是无状态协议,没有记忆力,一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接,这就意味着服务器无法从连接上跟踪会话。例如我们在没有登陆的情况下淘宝上添加商品到购物车,那么我们添加到购物车的商品信息存储到哪里呢?
因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术来识别客户端的状态。会话技术用来帮助服务器记住客户端状态,即区分客户端。

补充:
无状态协议 是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。

HTTP协议是无状态的协议。
在了解两者的区别和联系之前,我们先了解下什么是会话也就是Session


Session

从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,称为一次会话。
一次会话中可能会包含多次请求与相应。
当我们去访问某个网站(应用项目)时,我们就开始了会话,比如我们登录会员并打开爱奇艺看电影的时候,会有观看和浏览的历史记录,并且多台设备如果共用一个账户的话,历史记录会被同步,那么这些记录都存储在哪里呢?

答案就是Session,我们通过会话技术和缓存技术,将当前用户访问的记录通过Session技术存储在服务器,我们会有专门的服务器用来存储用户的访问信息,那么当客户在不同的PC端、不同的地域访问该网站或者应用时,那么我们会通过该服务器获取到相对应的数据。那么服务器是如何辨识是否是同一个用户呢?

我们先来举个栗子

Servlet:酒店的前台front desk
HTTP Request:Client客户
Session:酒店的前台的柜子
Session ID:存包号牌钥匙,编号为xxxx
Cookie:客户的packet包包,假定这个客户的忘性很大,记不住东西

那么第一次客户去xxxx酒店,想将包裹先暂存,那么就相当于客户端向服务器发送一次请求,服务器收到请求后会生成一串sessionID,就好比前台将存放包裹的钥匙key xxxx 给到客户,但是客户可以选择两种方式取包裹
1)记住key的号码,下次来直接报号码
2)随身携带钥匙key,如果需要取出包裹就把钥匙给服务员即可
那么第一种方式,客户可能第一次记住了,取了包裹,但是下次可能他就不记得那个柜子的号码,或者那个柜子被别人占用,要给新的指令了
第二种方式,客户拿到了钥匙,并且在指定时间归还即可,那么客户在这段时间就可以重复用同一个key来进行存取操作,这就相当于利用了cookie实现session的持久化。
在这里插入图片描述
所以说,Session其实可以算是基于Cookie存在的,Session保存的数据都是在服务器,而SessionID就是获取数据的钥匙,它为每一个客户都创建了一块内存空间来保存数据。
因此每个客户的Session都是不同的,如果客户是第一次访问,服务器会给浏览器一个32位数的字符串,之后在同一个会话中,浏览器会带着这个ID来查找自己的Session数据,这个key我们也可以理解为一个地址。如果这个JSESSIONID没有被cookie持久化保存,那么当前会话结束之后,服务器会重新分配key。
cookie
从上图我们可以看到,当我们第一次访问这个jsp页面的时候,服务器会自动response一个JSESSIONID,我们就拿到了一个门禁卡,当我们下次访问的时候,拿着这个密钥可以再次访问,在这同一个会话当中,我们可以使用

request.getSession().setAttribute(name, value);

来给session赋值,就好比我们存放东西到柜台,那么如果需要取东西的话,就可以使用

request.getSession().getAttribute(name);

而且通过这种方式存取会比较安全,原因是我们使用的是随机密钥来存取服务器中的数据,而不是数据本身。
我们还可以通过以下方式来移除属性,并可以给session设置时常

request.getSession().removeAttribute(name);
request.setMaxInactiveInterval(1000);//单位是秒,默认持续30分钟,会话结束,会自动结束
Session对象的生命周期

创建:第一次请求Servlet,且调用request.getSession()时创建;如果是第1次请求JSP页面,web服务器会自动创建session。
销毁:sesion有如下三种“死法”
1)服务器正常关闭时
2)session过期(默认有效期是30分钟)
3) 手动销毁session,使用 session.invalidate()


Cookie

Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器随机分配一个Cookie。客户端会把Cookie保存起来。
当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。有没有觉得这个过程和Session的存取过程很相似?
没错!Session是依赖于Cookie存在的,因此Session的一系列操作和Cookie息息相关。我们接下来先了解下Cookie

Cookie的组成

包含名字,值,过期时间,路径和域。路径与域
1)Name 和 Value 属性由程序设定,默认值都是空引用。
2)Domain属性的默认值为当前URL的域名部分,不管发出这个cookie的页面在哪个目录下的。
3)Path属性的默认值是根目录,即 ”/” ,不管发出这个cookie的页面在哪个目录下的。可以由程序设置为一定的路径来进一步限制此cookie的作用范围。比如说 cookie.setPath(“/myweb”): 表示myweb项目下的所有web资源都可以访问当前Cookie.
4)Expires 属性,这个属性设置此Cookie 的过期日期和时间。

Cookie cookie = new Cookie("marco", "18");
cookie.setMaxAge(100000);
Cookie的分类

会话级别Cookie: 默认级别,cookie存储在浏览器的内存中,当关闭浏览器,Cookie就销毁了
持久级别Cookie: 即设置了Cookie有效时间,关闭浏览器也不会销毁的Cookie。

设置持久级别Cookie需要使用 setMaxAge(int expriry)方法,expriry以秒为单位的时间,超过该时间后Cookie会自动销毁。设置了有效时间后,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。

Cookie的缺点

不安全:
因为cookie存在客户端,可以被人为的获取和修改,因此我们实际中cookie不会用于存储账号密码等安全性要求高的数据,而是会存储一个密钥,通过这个密钥和服务器的密钥做匹配,然后再获取数据。

不支持中文:
可以通过URLEncoding.encode()的方式来解决中文存取问题。

Cookie是有大小限制的:
Cookie大小限制在4KB之内;
1)一台服务器在一个客户端最多保存20个Cookie;
2)一个浏览器最多可以保存300个Cookie;

Cookie不能操作对象


总结

1.Cookie是将数据保存在客户端,而Session则是将数据保存在服务器的
2.Cookie和Session的生命周期默认都是当前会话,也就是浏览器开启和关闭的这一段时间。但是Cookie的生命周期是可以人为的控制(通过设置setMaxAge),但是Session就算设置了时常,如果当前的会话结束,仍然无法保存。因此Cookie可以实现持久化,而Session则不能实现持久化。
3.Cookie不安全,而Session相对安全
4.Cookie适用于保存信息量少的数据,不能存储对象,而Session可以存储数据量较大的数据,但是因为Session的数据都是保存在服务器上,为了适当的减少服务器的压力,我们应当尽可能多的合理的使用Cookie来替代Session
5.我们可以考虑将登陆信息,验证码等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值