首页  >  文章  >  后端开发  >  传智播客会话管理教程

传智播客会话管理教程

炎欲天舞
炎欲天舞原创
2017-08-24 11:02:531495浏览

课程介绍:

  1 加载web应用资源文件

  2 cookie入门

  3 cookie详解

  4 cookie案例-用户上次访问时间1

  5 cookie案例-用户上次访问时间2

  6 cookie案例-浏览过的商品

  7 session技术详解

播放地址:http://www.php.cn/course/564.html

讲师特点:思路严谨,认真,懂得把握要点,让同学们知道什么时候需要重点去记忆,学的轻松,学的快。

难点分析:cookie原理要点;

                 coookie和session的相同点和不同点;

                 coookie和session在什么时候去使用。

课件下载地址:http://www.php.cn/xiazai/code/2083

  因为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头字段的值。

  了解会话的概念和Cookie技术,接下来对Session做了详细的介绍与示例演示。这段视频主要讲解

了什么是Session、Session的跟踪机制、Session的超时管理、HttpSession接口中的方法、

HttpServletRequest接口中的Session方法、application与session域范围的属性比较、利用

Cookie实现Session跟踪、利用URL重写实现Session跟踪。这些技术都是以后要经常用到的。

    使用Cookie和附加URL参数都可以将上一次请求的状态信息传递到下一次请求中,但是如果传递

的状态信息较多,将极大降低网络传输效率和增大服务器端程序处理的难度,为了解决这个问题,

Session技术就产生了。Session技术是一种将会话状态保存在服务器端的技术。在会话过程中,客

户端需要接收、记忆和回送 Session的会话标识号,Session可以且通常是借助Cookie来传递会话标

识号。就如看到的那样,Cookie和Session往往是协同工作的,这样就能解决Http协议无状态的性质

。有了Session这个概念,就需要程序来实现,然后让服务器能够成功跟踪具体的某一个Session。

在Servlet API规范中,定义了一个HttpSession接口,HttpSession接口定义了各种管理和操作会

话状态的方法。WEB服务器产生的HttpSession对象是保持会话状态信息的存储结构,一个客户端在

WEB服务器端对应一个各自的HttpSession对象。WEB服务器并不会在客户端开始访问它时就创建

HttpSession对象,只有客户端访问某个能与客户端开启会话的Servlet程序时,WEB应用程序才会创

建一个与该客户端对应的HttpSession对象。WEB服务器为每个HttpSession对象分配一个独一无二的

会话标识号,然后在响应消息中将这个会话标识号传递给客户端。客户端需要记住会话标识号,并在

后续的每次访问请求中都把这个会话标识号传送给WEB服务器,WEB服务器端程序依据回传的会话标识

号就知道这次请求是哪个客户端发出的,从而选择与之对应的HttpSession对象。因为服务器端的资

源是有限的,不能无限制的保存HttpSession对象,所以WEB应用程序创建了与某个客户端对应的

HttpSession对象后,只要没有超出一个限定的空闲时间段,HttpSession对象就驻留在WEB服务器内

存之中,该客户端此后访问任意的Servlet程序时,它们都使用与客户端对应的那个已存在的

HttpSession对象。HttpSession接口中专门定义了一个setAttribute方法来将对象存储到

HttpSession对象中,还定义了一个getAttribute方法来检索存储在HttpSession对象中的对象,存

储进HttpSession对象中的对象可以被属于同一个会话的各个请求的处理程序共享。

    前面提到的服务器资源有限,WEB服务器无法判断当前的客户端浏览器是否还会继续访问,也无

法检测客户端浏览器是否关闭,所以,即使客户已经离开或关闭了浏览器,WEB服务器还要保留与之

对应的HttpSession对象。但是随着时间的推移而不断增加新的访问客户端,WEB服务器内存中将会

因此积累起大量的不再被使用的HttpSession对象,并将最终导致服务器内存耗尽。因此WEB服务器

采用“超时限制”的办法来判断客户端是否还在继续访问,如果某个客户端在一定的时间之内没有发

出后续请求,WEB服务器则认为客户端已经停止了活动,结束与该客户端的会话并将与之对应的

HttpSession对象变成垃圾。如果客户端浏览器超时后再次发出访问请求,WEB服务器则认为这是一

个新的会话的开始,将为之创建新的HttpSession对象和分配新的会话标识号。虽然会有少数出现事

实上的同一会话,却产生两次HttpSession对象,但是相对于大量正常的访问请求,这种情况基本上

可以忽略了。在Servlet API中,会话的超时间隔可以在web.xml文件中设置,其默认值由Servlet容

器定义。

    例如:<session-config>
              <session-timeout>30</session-timeout>
          </session-config>

    下面拿出视频中的一个小例子来说明一下使用Session实现购物车:

      String courseSelect = request.getParameter("course");
      if(courseSelect != null){
          Vector vCourses = (Vector)session.getAttribute("courses");
          if(vCourses == null){
              vCourses = new Vector();
              vCourses.add(courseSelect);
              session.setAttribute("courses",vCourses);
          }
          else{
              if(vCourses.contains(courseSelect)){
                  out.println(sessionName + ",你以前选择过了" + 
                             courseSelect + "<hr>");
              }
              else{
                  vCourses.add(courseSelect);
              }
          }
      }

上面的代码首先判断访问请求是否来自一个已登录用户,如果不是,则将请求重定向到logon.html页

面。接着判断当前访问请求是否是用户选择课程时发出的,如果是,则将用户选择的课程加入购物车

。最后显示出所有供选择的课程列表和已放入购物车中的课程列表。

以上是传智播客会话管理教程的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn