Cookie与Session

Cookie引入

​ 当用户在未登录的状态下在京东购物网站向购物车中添加某些商品后,将浏览器关闭,然后再打开浏览器访问京东,此时查看购物车会发现,购物车中仍然具有刚才添加的商品,那么这些商品的信息是存放在了哪里呢?

​ 当登录125邮箱时候选上 ‘10天内免登录’ 再登陆的时候是不需要用户名和密码的,那么是网站不需要对用户进行验证了?当然不是。那么,网站用于验证的用户名和密码是从哪里获取到的呢?

​ 这两个例子都有一个共同点,换一台机器就不是前面所述的情况了,那就说明一个问题,那些信息是保存在客户端电脑的硬盘里的,而不是再内存中

Cookie简介

​ Cookie是1993年由网景公司(NetScape)前雇员发明的一种进行网络会话状态跟踪的技术

​ 会话则是由一组请求与响应组成,是围绕看一件相关事情所进行的请求与响应。所以这些请求与响应之间一定是需要有数据传递的,即是需要进行会话状态跟踪的。然而HTTP协议是一种无状态协议,在不同的请求间是无法进行数据传递的。此时就需要一种可以进行请求间数据传递的会话跟踪技术,而Cookie就是一种这样的技术。。

​ Cookie是由服务器生成,保存在客户端的一种信息载体。这个载体中存放着用户访问该站点的会话状态信息。只要Cookie没有被清空,或都Cookie 没有失效,那么,保存在其中的会话状态就有效。。

​ 用户在提交第一次请求后, 由服务器生成Cookie,并将其封装到响应头中,以响应的形式发送给客户端。客户端接收到这个响应后,将Cookie保存到客户端。当客户端再次发送同类请求后,在请求中会携带保存在客户端的Cookie数据,发送到服务端,由服务器对会话进行跟踪。。

​ Cookie技术并不是JavaWeb开发专属技术,而是属于Web开发的技术,是所有Web开发语言均支持的技术。

​ Cookie是由若干键值对构成,这里的键一般称为name,值称为value. Cookie中的键值对均为字符串

​ 不同的浏览器,其Cookie的保存位置以及查看方式是不同的。删除了某一浏览器下的Cookie,不会影响到其他浏览器中的Cookie

Cookie禁用

​ 浏览器是可以禁用Cookie的,所谓禁用是指客户端浏览器不接受服务器发送来的Cookie,不过现在很多网站,若是禁掉了Cookie,则将无法访问

域属性空间范围对比

在javaweb编程的API中,存在三个可以存放域属性的空间范围对象

这三个对象中所存储的域属性的作用范围,由大到小分别为ServletContext —> HttpSession —> HttpServletRequest

ServletContext:即application,置入其中的域属性是整个应用范围的,可以完成跨会话共享数据

HttpSession:置入其中的域属性是会话范围的,可以完成跨请求共享数据

HttpServletRequest:置入其中的域属性是请求范围的,可以完成跨servlet共享数据,但这些servlet必须在同意请求中

对于这三个域属性空间对象的使用原则是:在可以保证功能需求前提下,优先使用小范围的,这样不仅可以节省服务器的内存,还可以保 证数据的安全性

HttpSession

​ Session,即会话,是Web开发中的一种会话状态跟踪技术,前面的Cookie也是一种会话跟踪技术。不同的是Cookie将会话状态保存在了客户端,而Session则是将会话状态保存在了服务器端

​ 那么,到底什么是会话?当用户打开浏览器,从发出第一次请求开始,一直到最终关闭浏览器,就代表一次会话的完成,站在用户角度,是这样,但对于服务器来说,是你第一次访问我,会话开始了,Session失效,会话才结束

​ Session并不是JavaWeb开发所持有的,而是整个Web开发中所使用的技术。在JavaWeb开发中,Session是以javax.servlet.http.

HttpSession的接口对象的形式出现的

Session的工作原理

​ 在服务器中系统会为每个会话维护一个Session,不同的会话,对应不同的Session,那么系统是如何识别各个Session对象的?即是如何做到在同一会话过程中,一直使用的 是同一个Session对象呢?

1.写入Session列表

​ 服务器对当前应用的Session是以Map的形式进行管理的,这个Map称为Session列表,该Map的key是一个32位长度的随机串,这个随机串称为JSessionID(Java Session ID),vaule则为Session对象的引用

​ 当用户第一次提交请求时,服务端Servlet中执行到request.getSession()方法后,会自动生成一个Map.Entry对象,key为一个根据某种算法新生成的JSessionID,value则为新创建的HttpSession对象

2.服务器生成并发送Cookie

​ 在将Session信息写入到Session列表后,系统还会自动将JSESSIONID作为name,这个32位长度的随机串作为value,以Cookie的形式放回到相应报头中,并随着响应将该Cookie发送到客户端

3.客户端接收并发送Cookie

​ 客户端接收到这个Cookie后会将其存放到浏览器的缓存中。即:只要客户端的浏览器不关闭,浏览器缓存中的Cookie就不会消失

​ 当用户提交第二次请求时,会将缓存中的这个Cookie,伴随着请求的头部信息,一块发送到服务端

4.从Session列表中查找

​ 服务端从请求中读取到客户端发送来的Cookie,并根据Cookie的JSESSIONID的值,从Map中查找相应的key所对应的value,即session对象,然后对该对象的域属性进行读写操作

Session的失效

​ Web开发中引入的Session超时的概念,Session失效就是指的Session的超时,若某个Session在指定的时间范围内一直没被访问,那么Session将超时,即失效

​ 在web.xml中可以通过标签来设置Session的超时时间,单位为分钟,默认的Session的超时时间为30分钟,需要强调的是,这个时间并不是从Session被创建开始计时的生命周期时常,而是从最后一次被访问开始计时。

​ 若未到超时时限,也可以通过代码使Session失效 ,HttpSession中的方法Invalidate(),会解绑其上所有的对象,注意使Session失效但失效的Session并不为null

Cookie禁用后使用Session进行会话跟踪

​ 从前面的Session的工作原理可知,服务器之所以可以根据不同的会话找到不同的Session,是因为Cookie完成了会话的跟踪。但是,若客户端浏览器将Cookie禁用,那么服务器还怎么保证同一次会话使用的是同一个Session呢?

​ 若客户端浏览器禁用了Cookie,会发现向服务器所提交的每一次请求,服务器在给出的相应中都会包含名为JSESSIONID的Cookie只不过这个Cookie的值每次一都不相同,也就是说,只要客户端浏览器所提交的请求中没有JSESSIONID,服务器就会认为这是一次新的会话的开始,就会为其生成一个Map.Entry对象,key为新的32位长度的随机字符串,value为新创建的Session会话引用。这样的话,也就无法实现会话跟踪了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大恐龙的小弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值