session和cokie区别

cookie的引入:

打开www.jd.com,未登录状态下,将一些商品加入购物车,关掉网页,再次访问www.jd.com,未登录购物车依旧有刚刚所添加商品,重启电脑,再次访问www.jd.com,未登录购物车依旧有刚刚所添加商品。
上面的情景说明:刚添加到购物车的商品信息,是保存到了客户端的硬盘上。

cookie简介:

是一种进行网络会话状态跟踪的技术。
会话是由一组请求与响应组成,是围绕着一件相关事情所进行的请求与响应。所以这些请求与响应之间一定是需要数据传递的,即是需要进行会话状态跟踪的。然而HTTP协议是一种无状态协议,在不同的请求间是无法进行数据传递的,此时就需要一种可以进行请求间数据传递的会话跟踪技术,而cookie就是这样一种技术。
cookie是由服务器生成保存在客户端的一种信息载体。在这个在载体中存放着用户访问该站点的会话信息。只要cookie没有被清空,或cookie没有失效,那么,保存在其中的会话状态就有效。
用户在提交第一次请求后,由服务器生成cookie,并将其封装到响应头中,以响应的形式发送给客户端。客户端收到这个响应后,将cookie保存到客户端,当客户端再次发送同类请求后,在请求中会携带保存在客户端的cookie数据,发送到服务端,由服务器对会话进行跟踪。
cookie技术并不是javaweb开发专属技术,而是属于web开发的技术,是所有web开发语言均支持的技术。
cookie是由若干键值对构成,键称为name,值称为value,cookie中的键值对均为字符串。

JavaEE中的cookie:

指定绑定的路径,必须加上项目名称,否则访问不到。
设置Cookie的有效期,这个值为一个整型值,单位为秒
该值大于0,表示Cookie存放到客户端的硬盘
该值小于0,与不设置效果相同,会将Cookie存放到浏览器缓存
该值等于0,表示Cookie一经生成,马上失效

域属性空间范围对比

在javaweb编程的API中,存在三个可以存放域属性的空间范围对象,这三个对象中所存储的域属性作用范围,由大到小分别为:
ServletContext、HttpSession、HttpServletRequest。
ServletContext,即application,置入其中的域属性是整个应用范围的,可以完成跨会话共享数据。
HttpSession,置入其中的域属性是会话范围的,可以完成跨请求共享数据。
HttpServletRequest,置入其中的域属性是请求范围的,可以完成跨Servlet共享数据,但这些Servlet必须在同一请求中。
对于这三个域属性空间对象的使用原则是,在可以保证功能需求的前提下,优先使用小范围的,这样不仅可以节省服务器内存,还可以保证数据的安全性。

HttpSession

session即会话,是web开发中的一种会话状态跟踪技术,cookie保存在客户端,session保存在服务器端。
会话是什么?当用户打开浏览器,从发出第一次请求开始,一直到最终关闭浏览器,就代表一次会话的完成。
Session并不是javaweb开发所特有的,而是整个web开发中所使用的技术,在javaweb开发中,Session是以java.servlet.http.HttpSession的接口对象的形式出现的。
对于request的getSession()用法:
一般情况下,若要向Session中写入数据,则需要使用getSession(true),即getSession()方法
意义是,有老的用老的,没老的用新的
若要从Session中读取数据,则需要使用getSession(false)
意义是,有老的用老的,没老的返回null。因为要读取数据,必须是从老的Session中读取

Session的工作原理

在服务器中系统会为每个会话维护一个Session。不同的会话,对应不同的Session。那么,系统是如何识别各个Session对象的?即是如何做到在同一会话过程中,一直使用的是同一个Session对象呢?
(1)写入Session列表
服务器对当前应用中的Session是以Map形式进行管理的,这个Map称为Session列表。该Map的key作为一个32位长度的随机串,这个随机串称为JSessionID,value为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对象的域属性进行读写操作。

Session的失效

session的失效就是指session的超时,若某个session在指定的时间范围内一直未被访问,那么session将超时,即将失效,
默认session的超时时间是30分钟,这个时间是指从最后一次访问开始计时,在指定的时长内一直未被访问的时长。

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

(1)重定向之后,response.encodeRedirectURL。
(2)超链接的URL重写

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值