传智播客Java web之 会话与状态管理

 

    因为HTTP协议时无状态的协议,所以WEB服务器对用户的每次请求都当做是一次全新的请求。但是很多WEB应用程序的需求中需要保存上一次请求的某些信息。为了解决这个问题,会话与状态管理的问题就产生了。在视频中,有关知识点包括:WEB应用中的会话与会话状态,Cookie,在Servlet程序中使用Cookie,Session,Session的典型案例,Session的持久化管理。
    所谓会话,是指一个客户端浏览器与WEB服务器之间连续发生的一系列请求和响应过程。WEB应用的会话状态是指WEB服务器与浏览器在会话过程中产生的状态信息,借助会话状态,WEB服务器能够把属于同一会话中的一系列的请求和响应过程关联起来。 例如某个用户从网站的登录页面登入后,再进入购物页面购物时,负责处理购物请求的服务器程序必须知道处理上一次请求的程序所得到的用户信息。由于HTTP协议是一种无状态的协议,WEB服务器本身不能识别出哪些请求是同一个浏览器发出的 ,浏览器的每一次请求都是完全孤立的。所以WEB服务器端程序要能从大量的请求消息中区分出哪些请求消息属于同一个会话,即能识别出来自同一个浏览器的访问请求,这需要浏览器对其发出的每个请求消息都进行标识,属于同一个会话中的请求消息都附带同样的标识号,而属于不同会话的请求消息总是附带不同的标识号,这个标识号就称之为会话ID(SessionID)。SessionID是由服务器产生并且传递给浏览器的,如果客户端要接收并且回传给服务器进行验证就需要相应的机制,这就是Cookie技术,它不仅可以临时接收并保存相应的会话信息,还可以长时间记录在客户端硬盘上。SessionID不仅可以通过Cookie的技术在请求消息中进行传递,也可以作为请求URL的附加参数进行传递。SessionID是WEB服务器为每客户端浏览器分配的一个唯一代号,它通常是在WEB服务器接收到某个浏览器的第一次访问时产生,并且随同响应消息一道发送给浏览器。会话过程由WEB服务器端的程序开启,一旦开启了一个会话,服务器端程序就要为这个会话创建一个独立的存储结构来保存该会话的状态信息,同一个会话中的访问请求都可以且只能访问属于该会话的存储结构中的状态信息。
    Cookie是一种在客户端保持HTTP状态信息的技术,它好比商场发放的优惠卡。Cookie是在浏览器访问WEB服务器的某个资源时,由WEB服务器在HTTP响应消息头中附带传送给浏览器的一片数据,WEB服务器传送给各个客户端浏览器的数据是可以各不相同的。一旦WEB浏览器保存了某个Cookie,那么它在以后每次访问该WEB服务器时,都应在HTTP请求头中将这个Cookie回传给WEB服务器。WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器,浏览器则通过在HTTP请求消息中增加Cookie请求头字段将Cookie回传给WEB服务器。一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
    程序中可以用Set-Cookie和Set-Cookie2头字段用于指定WEB服务器向客户端传送的Cookie内容,两者只是使用的规范不同,但两者的语法和作用类似。可以根据浏览器的支持情况选择合适的响应头字段。Set-Cookie2头字段中设置的cookie内容是具有一定格式的字符串,它必须以Cookie的名称和设置值开头,格式为"名称=值",后面可以加上0个或多个以分号(;)和空格分隔的其它可选属性,属性格式一般为"属性名=值"。
   最后说明一下浏览器回传Cookie的求求头字段。浏览器使用Cookie请求头字段将Cookie信息回送给WEB服务器。多个Cookie信息通过一个Cookie请求头字段回送给WEB服务器。浏览器是否发送某个Cookie信息根据下面的几个规则决定:
      1.请求的主机名是否与某个存储的Cookie的Domain属性匹配
      2.请求的端口号是否在该Cookie的Port属性列表中
      3.请求的资源路径是否在该Cookie的Path属性指定的目录及子目录中
      4.该Cookie的有效期是否已过Cookie请求头字段中的每个Cookie之间用逗号(,)或分号(;)分隔。Cookie请求头字段中除了必须有"名称=值"的设置外,还可以有Version、Path、Domain、Port等几个属性。但是如果要设置Version、Path、Domain、Port等属性时,需要在属性名之前增加一个"$"字符作为前缀,并且Version属性只能出现一次,且要位于Cookie请求头字段设置值的最前面,如果需要设置某个Cookie信息的 Path、Domain、Port等属性,它们必须位于该Cookie信息的"名称=值"设置之后。Path属性需要注意的是该属性指向子目录的Cookie要排在Path属性指向父目录的Cookie之前。例如:Cookie: $Version=1; Course=Java; $Path=/it315/lesson; Course=vc; $Path=/it315。该Cookie就符合上述约束。视频教程中演示了一个具体的实例:
代码一:
      Cookie ckName = new Cookie("name",name);
      Cookie ckNickname = new Cookie("nickname",nickname);
      ckNickname.setMaxAge(365*24*3600);
      Cookie ckEmail = new Cookie("email","test1@it315.org");
      Cookie ckPhone = new Cookie("phone","1111111");
      response.addCookie(ckName);
      response.addCookie(ckNickname);
      response.addCookie(ckEmail);
      response.addCookie(ckPhone);
代码二:
      String lastNickname = null;
      Cookie [] cks = request.getCookies();
      for(int i=0; cks!=null && i<cks.length; i++) {
          if("nickname".equals(cks[i].getName())) {
              lastNickname = cks[i].getValue();
              break;  
          }
      } 
      if(lastNickname != null) {
      out.println("欢迎您," + lastNickname );
      }
以上代码片断一是产生四个名称分别为name、nickname、email、phone的Cookie信息。name和nickname这两个Cookie的值是通过请求参数来设置的,并且nickname这个Cookie保持有效的时间为1年,email和phone这两个cookie的值是在程序中硬编码指定的。代码片断在二是在产生Cookie信息之后接着从请求消息中查找名称为nickname的Cookie信息,并根据返回结果打印出相应的问候语,片断中还打印出请求消息中的Cookie头字段的值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值