session和cookie

内存:将数据存入内存,优点是读取快,缺点是重启后就不存在了。比如购物车中的数据如果存到内存后,重启机器后就会清除。硬盘:将数据存入硬盘,缺点是读取慢,优点是重启后还会一直存在,比如购物车中的数据如果是存到硬盘中,重启机器后仍会存在。

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

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

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

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

        cookie技术并不是javaweb开发专属技术,而是属于web开发的技术,是所有web开发语言均支持的技术。

        cookie是由若干键值对构成,这里的键一般称为name,值称为value。不同的浏览器,其cookie的保存位置及查看方式是不同的,删除了某一个浏览器下的cookie,不会影响到其他浏览器中的cookie。

服务端生成cookie

服务器端获取cookie

Session的基本用法

    Session,即会话,是web开发中的一种会话状态跟踪技术。当然,前面所讲述的cookie也是一种会话跟踪技术。不同的是cookie是将会话状态保存在了客户端,而Session则是将会话状态保存在了服务器端。

1、什么是会话?

当用户打开浏览器,从发出第一次请求开始,一直到最终关闭浏览器,就表示一次会话的完成。

2、创建session

若要对Session进行操作,则可以通过HttpServletRequest的getSession()方法获取。该方法具有两个重载的方法。

public HttpSession getSession(boolean create)

该方法用于创建Session。若参数create为true,则表示若当前没有Session,则新建一个Session,若当前存在Session则使用当前的Session。若参数create为false表示若当前没有Session,则直接返回null

public HttpSession getSession()

该方法用于创建Session,相当于getSession(true),即没有Session则创建新的Session。

何时使用getSession(true),何时使用getSession(false)呢?

       一般情况下,若要向Session中存放数据,则使用getSession(true),意义为:若当前存在Session,则使用当前的Session,若当前不存在Session,则创建一个新的Session。因为存放的数据是必须要有Session。

       若要从Session中获取数据,则一般使用getSession(false)。意义为:若当前存在Session,则从中获取数据,若当前根本就没有Session,那就更不可能存在Session中的数据了。无需创建一个新的Session,再从新的Session中获取数据,因为新创建的Session中是不可能有数据的。

3、Session域属性空间

        Session是一个专门用于存放数据的集合,我们一般称这个用于存放数据的内存空间为域属性空间,简称域。HttpSession中具有三个方法,是专门用于对该域属性空间中数据进行写、读操作。

public void setAttribute(String name,Object value)

该方法用于向Session的域属性空间中放入指定名称、指定值得域属性。

public Object getAttribute(String name)

该方法用于从Session的域属性空间中读取指定名称为域属性值。

public void removeAttribute(String name)

该方法用于从Session的域属性空间中删除指定名称的域属性。

4、Session的工作原理

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

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

5、服务器生成并发送Cookie

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

6、客户端接收并发送Cookie

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

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

7、从Session列表中查找

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

8、Session的失效

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

       在web.xml中可以通过<session-config/>标签设置session的超时时间,单位为分钟。默认Session的超时时间为30分钟。需要再次强调的是,这个时间并不是从Session被创建开始计时的生命周期时长,而是从最后一次被访问开始计时,在指定的时长内一直未被访问的时长。

若未到超时时限,也可通过代码提前使Session失效。HttpSession中的方法invalide(),使得Session失效。

public void invalide();

       session的过期时间是从session不活动的时候开始计算,如果session一直活动,session就总不会过期,从该Session未被访问,开始计时; 一旦Session被访问,计时清0。

三个域属性空间的对比

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

芦蒿炒香干

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

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

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

打赏作者

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

抵扣说明:

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

余额充值