第四章、维护会话.ppt

上传人:sccc 文档编号:6108101 上传时间:2023-09-25 格式:PPT 页数:69 大小:782.13KB
返回 下载 相关 举报
第四章、维护会话.ppt_第1页
第1页 / 共69页
第四章、维护会话.ppt_第2页
第2页 / 共69页
第四章、维护会话.ppt_第3页
第3页 / 共69页
第四章、维护会话.ppt_第4页
第4页 / 共69页
第四章、维护会话.ppt_第5页
第5页 / 共69页
点击查看更多>>
资源描述

《第四章、维护会话.ppt》由会员分享,可在线阅读,更多相关《第四章、维护会话.ppt(69页珍藏版)》请在三一办公上搜索。

1、第四章 维护会话,跟踪客户会话 使用HttpSession对象维护会话信息 监视会话对象,跟踪客户会话,HTTP通信过程网上商店购物流程 什么是会话 会话的工作机制 维护会话的几种方式URL重写技术cookie技术隐藏窗体技术HttpSession对象,跟踪客户会话,4.1节,HTTP通信过程客户向Web服务器发送一个HTTP请求,服务器收到请求后根据请求做必要的处理并生成一个响应信息,然后把它回送给客户。这个请求响应过程是在一条网络连接上发生的。这一过程结束后,服务器就关闭了该连接。服务器的任何失败或任何网络失败都会导致连接的终止。当用户发送另一条请求时,所有的请求 响应循环都再次发生,客户

2、和服务器之间必须重新建立连接。HTTP/1.1中有了一个可选特性“keep-alive”,允许客户在多个请求之间使用相同的连接。但是浏览器只有在服务器支持的时候才能使用这一特性,并且相关的请求之间的时间间隔都比较小。,跟踪客户会话,4.1节,跟踪客户会话 HTTP通信过程,跟踪客户会话,4.1节,跟踪客户会话HTTP协议无状态性,HTTP协议无状态连接的优点每个请求-响应操作一结束,所用的网络连接即被关闭,Web服务器的资源不会被无谓占用,Web服务器可为更多的用户服务HTTP协议无状态连接的缺点基于HTTP协议的使用Servlet技术的Web应用也是无状态的。同一用户的不同次请求响应操作是通

3、过不同的网络连接实现的当用户第一次访问服务器时,该用户的信息就被保存在服务器中。但当用户第二次再访问服务器时,由于前后二次的访问是通过二次的网络连接实现的,服务器无法判断前后二次访问是否属于同一个用户也就是说,基于Http协议的服务器无法自动的在它所保存的用户信息与当前访问的用户之间建立起联系。需要由程序员通过编写Web服务器程序来实现这种联系,跟踪客户会话,4.1节,顾客在网上商店在线购物流程:顾客登录网上商店,Web服务器将商品展示网页做为响应信息发给顾客顾客选中一种商品通过客户端请求发给服务器,服务器再次将商品展示网页做为响应信息发给客户端,顾客再挑选另外商品顾客挑选完商品,向服务器发出

4、结算请求服务器将顾客购物信息发往网上银行进行结算。,什么是会话,跟踪客户会话,4.1节,网上商店的困惑顾客挑选的商品信息被保存在服务器端。但顾客的商品挑选是在多个网络HTTP连接中发生的服务器无法判断这些连接是否来自同一个顾客,所以商品的结算只能按逐个连接进行。显然这样的操作无法付诸实际这就需要一种机制:判断多次的网络请求响应操作,是否来自同一个客户也就是必须在客户端与服务器之间建立某种机制:对顾客挑选商品的多次的网络请求响应操作实行全程跟踪。这种机制必须保证:当用户在不同页面(如:Servlet)间浏览时,都能与该用户保存在的服务器的会话对象“购物车”保持联系除了自己的购物车,用户不应与其他

5、用户的购物车有任何联系,什么是会话,什么是会话,基于Http协议的Web服务器无法自动地为位于客户端的用户与Web服务器之间建立上述机制。建立上述机制是Web应用程序开发人员的任务。什么是会话:称同一顾客的多个网络请求响应操作为会话(session)称维护同一客户在不同网络请求响应操作之间关联为维护会话,跟踪客户会话,4.1节,会话(session)的特征会话能够把用户与该用户发出的不同请求之间关联起来。但不同用户的会话应当是相互独立的。会话一旦建立就一直存在,直到用户空闲时间(指二次请求的时间间隔)超过了某一个时间界限,或被用户强制截断,容器才释放该会话资源。在会话的存活期间,用户可能给服务

6、器发送了很多请求,该用户的这些请求信息都可以存储在属于该用户的会话中。,什么是会话,会话的工作机制,在客户端和服务器端引入某种记号,称为会话对象:会话对象能唯一标识一个顾客会话对象始终依附于同一个顾客的不同次网络请求响应操作中,随着网络请求响应操作在客户端和服务器之间不断被传递,以此来标识属于同一顾客的商品挑选操作,会话的工作机制-网上商店实例,用户输入个人信用信息登录到网上商店,商店为用户创建一个独一无二的、该用户独有的会话对象-购物车,跟踪客户会话,4.1节,网上商店的购物流程,跟踪客户会话,4.1节,网上商店的购物流程,会话的工作机制-网上商店实例,用户浏览商品网页,察看商品信息,挑选欲

7、购商品,欲购商品信息在一次HTTP连接中被传递到Web服务器,在Web服务器中,该欲购商品信息被保存在该用户的会话对象购物车中,会话的工作机制-网上商店实例,用户向网上购物商店发出结账请求,Web服务器将购物车中的欲购商品信息传递至客户端,供用户核对和确认,若用户核对并确认购买,Web服务器会将该用户会话对象中欲购商品信息保存到数据库中,并联系网上银行和邮局向用户结算和发货。,跟踪客户会话,4.1节,网上商店的购物流程,跟踪客户会话,4.1节,为了在位于客户端的用户与Web服务器之间建立联系,可以采用多种机制,常用以下几种方法:URL重写技术 cookie技术 隐藏窗体技术,维护会话的方式,跟

8、踪客户会话,4.1节,URL重写技术建立在这样的一种思想之下:当客户在某次会话中第一次访问网站时,服务器为其建立了一个对话对象,并用一个独一无二的会话ID做为标识的键值在服务器向客户发出的每一个响应中都嵌入了该项ID当用户于此后再次访问网站时,就在URL中加入这个会话ID,作为用户请求参数的一部分发给服务器端服务器根据接收的会话ID来标识该客户,维护整个会话的信息持续性。常见的URL重写格式为了保持URL的简洁,通常这个嵌在URL中的会话信息是一个由服务器生成的代表客户的唯一性的ID号,在URL的表现形式上,它通常是作为URL查询参数的形式出现的,如:http:/./servlet/Rewri

9、tten?sessionid=678,维护会话的方式-URL重写,跟踪客户会话,4.1节,Hashtable ht;public void init(ServletConfig config)throws ServletException ht=new Hashtable();public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException response.setContentType(“text/html;charset=GBK”);Pr

10、intWriter out=response.getWriter();out.println(“URL Rewriting Servlet”);out.println(“”);int visitCount;String sessionID=request.getParameter(“sessionID”);if(sessionID=null)Random rand=new Random();sessionID=Long.toString(rand.nextLong();visitCount=1;ht.put(sessionID,new Integer(visitCount);else visi

11、tCount=(Integer)ht.get(sessionID).intValue();visitCount+;ht.put(sessionID,new Integer(visitCount);out.println(Session ID=+sessionID);out.println(No.of times visited=+visitCount);out.println(Click here to visit servlet again.);out.close();public void destroy()ht.clear();ht=null;,public class URLRewri

12、tingServlet extends HttpServlet,跟踪客户会话,4.1节,维护会话的方式-URL重写,跟踪客户会话,4.1节,URL重写技术的优点:用户是匿名的;在Web服务器实现上得到普遍的支持;URL重写技术的缺点:由于会话信息作为查询参数在URL上是可见的,因此会话存在一定的安全隐患;需要对所有动态生成的URL进行重写,代码比较繁琐;只能用于动态产生的文档如Servlet和JSP页面,而不能用于HTML文档;重写的URL不能长期有效,维护会话的方式-URL重写,跟踪客户会话,4.1节,什么是cookie 一些网站会在您的计算机上的以小文本文件存储信息。这种文件称为cooki

13、e。,维护会话的方式-cookie技术,跟踪客户会话,4.1节,维护会话的方式-cookie技术,常见的cookie属性 保存在客户端的cookie中,通常保存下列属性以决定该cookie在会话中的作用和行为。,跟踪客户会话,4.1节,利用cookie跟踪维护客户信息的典型工作过程当客户首次访问网站时,服务器为该客户生成一个唯一的ID号,同时生成用于存放该客户会话信息的小表。同时服务器中维护有一张保存所有客户会话信息的大表。将存放会话信息的小表存放在大表中。并以客户ID号作为查找的索引。服务器生成一个cookie,以ID号作为cookie的键值发送给客户端。客户端浏览器存储该cookie,并在

14、后续的向服务器提出的访问请求中包含该cookie。在后续的访问中,服务器从客户发回的cookie中取出客户ID值并以此为索引从大表中取出该客户的会话信息,并进行维护处理。注意上述操作的前提:所用浏览器能够支持cookie的自动发送。,维护会话的方式-cookie技术,跟踪客户会话,4.1节,Servlet API 2.3对Cookie的支持Servlet API 2.3 提供了javax.servlet.http.Cookie类以支持cookie。它提供了对Cookie所有属性的设置与读取的方法。HttpServletResponse类中提供了一个方法用于向客户发送cookie:public

15、void addCookie(Cookiecookie);需要注意的是,在addCookie()前,应创建cookie对象并设置好该cookie的属性。HttpServletRequest类提供了一个方法用于查询客户cookie:public Cookie getCookies();注意:在一个客户请求中可能包含多个cookie对象,维护会话的方式-cookie技术,跟踪客户会话,4.1节,什么是cookie 一些网站会在您的计算机上的以小文本文件存储信息。这种文件称为cookie。,维护会话的方式-cookie技术,Hashtable ht;public void init(ServletC

16、onfig config)throws ServletException ht=new Hashtable();public void doGet(HttpServletRequest request,HttpServletResponse response)PrintWriter out=response.getWriter();Cookie cookies=request.getCookies();String sessionID=null;int visitCount=0;out.println(“URL Rewriting Servlet”);if(cookies!=null)for(

17、int i=0;iNo.of times visited=+Integer.toString(visitCount);out.println(Click here+to visit servlet again.);out.close();public void destroy()ht.clear();ht=null;,public class CookieServlet extends HttpServlet implements SingleThreadModel,跟踪客户会话,4.1节,利用cookie维护会话的优点有:目前大多数浏览器都可以识别和处理来自Web服务器的cookie,因此兼

18、容性较好,无论动态、静态文档都可以。因为Cookie可以保存在客户端的小文件中,因此cookie支持持久性的维持会话信息,哪怕浏览器关闭也可以维护。利用cookie维护会话的缺点有:cookie的名声不太好,个别网站可能在用户不知情的情况下采集客户个人信息。客户有可能因此关闭浏览器的cookie接收功能。并不是所有的浏览器都支持cookie。,维护会话的方式-cookie技术,跟踪客户会话,4.1节,隐藏窗体技术原理 HTML表单允许把一些字段信息隐藏起来,而在浏览器上不被显示出来。例如:使用隐藏窗体技术实现会话管理 这种方式的工作机制为:在用户第一次请求时,服务器在为客户准备的页面上添加一个

19、或多个隐藏表单,把一些要隐藏的信息如标识该客户的ID号存储在那里。当客户提交该表单时,这些信息会作为查询参数返回服务器,服务器可以利用HttpServletRequest对象的getParameter()方法读取出来。这样就达到了在服务器端维护会话信息持续的作用。,维护会话的方式-隐藏窗体技术,跟踪客户会话,4.1节,比比看 可以这样认为,同重写URL技术相比,隐藏窗体技术在表单参数中传递会话信息,而重写URL技术是在GET参数中传递会话信息。除了这点,二者并无根本区别。如:都属于非持久化会话方案都使用页面动态修改技术,因此不支持静态HTML代码编写方式很相似,维护会话的方式-隐藏窗体技术,跟

20、踪客户会话,4.1节,public void doGet(HttpServletRequest request,HttpServletResponse response)response.setContentType(text/html;charset=GBK);PrintWriter out=response.getWriter();out.println(URL Rewriting Servlet);int visitCount=0;String sessionID=request.getParameter(sessionID);if(sessionID=null)Random rand=

21、new Random();sessionID=Long.toString(rand.nextLong();visitCount=1;ht.put(sessionID,new Integer(visitCount);else visitCount=(Integer)ht.get(sessionID).intValue();visitCount+;ht.put(sessionID,new Integer(visitCount);out.println(Session ID=+sessionID);out.println(No.of times visited=+visitCount);out.pr

22、intln();out.println();out.println();out.println();out.println();,public class HiddenFormServlet extends HttpServlet implements SingleThreadModel,跟踪客户会话,4.1节,三种技术的小结 上面我们分别说明了如何使用URL重写、cookie和隐藏表单这三种方式来跟踪用户会话。不管采用何种方式,都应实现以下步骤:1、服务器必须为每个会话产生一个唯一的ID号2、在服务器和客户浏览器之间来回传递这个ID号,以维持会话3、服务器端维护根据ID号维护特定客户的会话信

23、息,维护会话的方式-隐藏窗体技术,Servlet中的解决方案-HttpSession,跟踪客户会话,4.1节,问题上述三种方式都是一些低级的API编程,程序员为了实现会话维护功能要做大量的编程工作,并且没有一个管理会话的功能框架。Servlet中的解决方案-HttpSessionServlet 2.3提供了一种较高级别的会话跟踪机制,可以减轻程序员的编程工作量。Servlet2.3规范定义了一个HttpSession接口:允许Servlet容器针对每一个用户建立一个HTTP会话(即HttpSession对象)每个HTTP会话都将会自动被赋予一个唯一的会话编号(session ID),而无需程序

24、员编程实现。HttpSession对象提供了和ServletContext对象相似的一组会 话属性的方法,可以很容易地在服务器端存放用户会话状态。,第四章 维护会话,跟踪客户会话 使用HttpSession对象维护会话信息 监视会话对象,HttpSession的基本概念会话与请求的关系HttpSession接口中的主要方法 存取HTTP会话属性终止HTTP会话,使用HttpSession对象维护会话信息,HttpSession的基本概念,用HttpSession对象维护会话,4.2节,用HttpSession对象维护会话,4.2节,在上一节中,我们学习了以下管理会话的方法URL重写Cookie

25、隐藏窗体但是上述方法都需要程序员进行大量的程序编写,十分繁琐。Servlet2.3 API规范定义了一个HttpSession接口:允许Servlet容器针对每一个用户建立一个HTTP会话对象(即HttpSession对象)该会话对象将会自动被赋予一个唯一的“会话编号”(session ID)同时,HttpSession对象提供了和ServletContext对象相似的一组存取会话属性的方法,这样就可以很容易的在服务器端存放用户会话状态。,使用HttpSession对象维护会话信息,HttpSession的基本概念,用HttpSession对象维护会话,4.2节,会话和请求之间的关系 会话维护

26、的就是同一用户的一组请求序列之间的关联性。因此,请求对象和会话对象HttpSession之间必然存在一定的关系。换言之,对于Servlet而言,当它处理不同用户发来的不同HttpServletRequest时,应该有能力判断该请求所属的用户(也即所属的HttpSession)。,会话与请求的关系,这些请求属于一个会话对象HttpSession,是同一个用户发往服务器的,当用户在不同的Servlet间浏览时,服务器可以用会话对象跟踪与该用户有关的状态。,这些请求属于另一个会话,代表另一个用户。这些请求可以与上面的请求同时发生,而Servl et能区分它们属于不同的会话对象,不会混淆。,用Http

27、Session对象维护会话,4.2节,获取与请求关联的会话对象 HttpServletRequest接口提供了getSession方法,通过这个方法,Servlet就可以获得与当前请求关联的会话对象的引用。该方法为重载的方法,有两个版本:public HttpSession getSession();返回与当前请求相关联的会话对象,若当前请求还没有一个相关联的会话,就自动创建一个会话并返回。public HttpSession getSession(bool bCreate);返回与当前请求相关联的会话对象。若当前请求还没有一个相关联的会话,则依参数bCreate的取值进行不同的处理:若参数b

28、create值为true,则创建一个新的会话。若bcreate值为false,则不创建新的会话而返回null。通过调用getSession(false)可判断用户是否第一次访问站点:若返回null,则表示用户是第一次访问若返回非null则表示用户不是第一次访问,会话与请求的关系,用HttpSession对象维护会话,4.2节,HttpSession接口提供了下列方法:public String getId()/获取会话对象的ID号public boolean isNew()/判断会话对象是否是新建的实例:HttpSession s=request.getSession();String sid

29、=s.getId();if(s.isNew()out.println(新的会话ID=+sid+);elseout.println(欢迎回来,User:+sid+);,会话与请求的关系,获取一个会话对象实例,获取会话对象ID,判断会话对象是否是新建的,用HttpSession对象维护会话,4.2节,会话IDservlet容器在创建每一个新的HTTPSession对象时,都会赋予一个新的会话ID号。servlet容器保证这个ID号在Web应用范围内是唯一的。在请求/响应的传递过程中,会话ID将包含在客户端的请求信息头和服务器响应信息头数据中。这个ID号可以通过HttpSession对象的getId

30、()获得。例如:HttpSession session=request.getSession();String sessionId=session.getId();,会话与请求的关系,用HttpSession对象维护会话,4.2节,HttpSession工作原理:当用户第一次发出请求时,Servlet容器会为该用户创建一个HttpSession对象,并自动为之分配一个在Web应用范围内唯一的Session ID。这个Session ID将随着HTTP响应内容传递给客户端浏览器。传递的方式默认情况下采用cookie方式。如果用户端浏览器关闭了cookie功能,就会使用URL重写方式传递给客户端浏

31、览器。在用户后续发出的请求中,请求信息头中将包含这个Session IDServlet容器从请求信息头中取出Session ID,与保存在HttpSession对象中的Session ID相比较,找出该请求所属的那个用户的HttpSession对象所以调用getSession()方法返回将是发出请求所属的HttpSession对象。,会话与请求的关系,用HttpSession对象维护会话,4.2节,会话对象是通过HttpSession接口方法访问的。除了前面用到的getId()和isNew()方法,还包含下列常用的方法:一、管理HttpSession属性方法二、终止会话方法,管理HttpSes

32、sion,用HttpSession对象维护会话,4.2节,与ServletContext对象类似,我们可以给HttpSession对象绑定属性。ServletContext对象的属性的作用域是Web应用程序,在这个应用程序下的所有Servlet都共享这些属性;绑定到HttpSession对象上的属性只在一次会话周期内有效,且只有在属于该会话的HttpRequest对象中才可以访问这些属性。换句话说,会话属性就是特定用户的专用数据,同时访问Web应用的其他用户无法访问这些属性。,HttpSession对象的属性,用HttpSession对象维护会话,4.2节,HttpSession接口方法访问属

33、性,HttpSession接口提供如下方法管理属性:public void setAttribute(String name,Object value)public Object getAttribute(String name)public void removeAttribute(String name),HttpSession接口方法访问属性,public void setAttribute(String name,Object value)将一个对象绑定到HttpSession对象,使之成为HttpSession对象的一个会话属性。调用时由value指定的对象将变成其name属性。如果

34、name属性已经存在,它原来对应的对象将由vlaue指定的对象置换掉。例:Account acct=new Account();HttpSession session=request.getSession(true);session.setAttribute(account,acct);session.setAttribute(account“,new Integer(100);,用HttpSession对象维护会话,4.2节,HttpSession接口方法访问属性,public Object getAttribute(String name)返回由name指定的会话属性,如果name指定的属

35、性不存在将返回null。例如:在同一用户的会话有效期内的其他地方,我们可以把绑定到HttpSession对象上的对象取出来例:HttpSession session=request.getSession(true);Account acct=session.getAttribute(account);,用HttpSession对象维护会话,4.2节,HttpSession接口方法访问属性,public void removeAttribute(String name)删除由name指定的HttpSession对象的会话属性,如果由name指定的属性不存在,方法将直接返回。例:HttpSessi

36、on session=request.getSession(true);session.removeAttribute(account);,用HttpSession对象维护会话,4.2节,不同对象属性的比较,在接口HttpServletRequest,HttpSession和ServletContext中都含有下列方法:public void setAttribute(Stringname,Objecto)public Object getAttribute(Stringname)public void removeAttribute(Stringname)在上述对象中设置的属性可在不同范围内

37、被共享:在HttpServletRequest中设置的属性,只能被属于同一个请求中的组件共享(参教材p42)在HttpSession中设置的属性,只能被属于同一个会话中的组件共享(参教材p97)在ServletContext中设置的属性,可被属于同一个Web应用程序中的组件共享(参教材p70)从上到下,属性共享的范围逐步扩大,用HttpSession对象维护会话,4.2节,public void doGet(HttpServletRequest request,HttpServletResponse response)int visitCount;HttpSession session=req

38、uest.getSession(false);if(session=null)visitCount=1;session=request.getSession(true);session.setAttribute(visitCount,new Integer(visitCount);else visitCount=(Integer)session.getAttribute(visitCount).intValue();visitCount+;session.setAttribute(visitCount,new Integer(visitCount);out.println(No.of time

39、s visited=+visitCount);,HttpSession接口方法访问属性,调用getSession(false):若返回null,说明是新用户,调用setAttribute()方法添加新属性visitCount注意:属性值只能是引用数据类型,不能是基本数据类型,调用getSession(true):若是新用户自动为他创建一个HttpSession对象,用HttpSession对象维护会话,4.2节,HttpSession接口方法终止会话,终止HTTP会话,可以使用下面几种方式:HttpSession接口提供的方法:public void invalidate()方法public

40、void setMaxInactiveInterval(int interval)方法在web.xml中设置会话的延续时间:延续时间,HttpSession接口方法终止会话,public void invalidate()调用该方法将终止某个HTTP会话。终止后,若再对这个会话的属性进行操作,将触发IllegalStateException异常例:HttpSession session=request.getSession(true);session.invalidate();Account acct=new Account();session.setAttribute(account,acc

41、t);/上句抛出llegalStateException,用HttpSession对象维护会话,4.2节,HttpSession接口方法终止会话,public void setMaxInactiveInterval(int interval)设置HTTP会话的超时时间,单位为秒。例:HttpSession session=request.getSession(true);session.setMaxInactiveInterval(600);说明:在上例中,若用户访问服务器,两次请求的时间间隔超过了10分钟,容器将终止该会话。若interval的值设置为负数,HTTP会话将永不超时,除非容器被

42、关闭,否则这个HTTP会话会一直存在于内存之中。,用HttpSession对象维护会话,4.2节,HttpSession接口方法终止会话,在web.xml中配置会话的生存时间我们还可以在web.xml文件中设定所有HTTP会话的超时时间。可在元素下,用子元素指定,单位为分钟例:30 说明:在上例中,若在程序中没有另外指定,某一会话对应的用户 两次请求的时间间隔超过30分钟,容器将终止该会话,用HttpSession对象维护会话,4.2节,第四章 维护会话,跟踪客户会话 使用HttpSession对象维护会话信息 监视会话对象,对于网上商店的管理人员和顾客,需要了解网上商店当前的在线顾客总人数。

43、本节中,我们将了解如何通过HttpSessionListener侦听器,引入一个在线人数计数器,以跟踪并显示网上商店当前的在线顾客总人数。,监视会话对象,监视会话对象,4.3节,会话侦听器是用来监听会话事件的监听器类。该类程序要由程序员编写。编写步骤:侦听器类必须实现系统提供的相关的会话侦听器接口侦听器类中必须重写接口中的所有抽象方法侦听器类必须在web.xml文件中注册(部署)主要有两类会话事件侦听器:会话生命周期事件侦听器会话属性事件侦听器,会话事件分类,会话事件的分类,会话生命周期事件侦听器涉及的事件类:HttpSessionEvent该类包括事件:会话的创建、会话的纯化、会话的激活、会

44、话的销毁。涉及的事件侦听器接口:HttpSessionListenerHttpSessionActivationListener会话属性事件侦听器涉及的事件类:HttpSessionAttributeEvent该类包话事件:属性的添加、属性的修改、属性的删除。涉及的事件侦听器接口:HttpSessionAttributeListenerHttpSessionBindingListener,一、会话生命周期事件侦听器,监视会话对象,4.3节,当会话的状态发生变化时(生成、钝化、激活、销毁会话)时,容器将生成一个HttpSessionEvent对象,以此作为参数调用注册监听器中事件处理方法说明:上

45、图中HttpSessionActivationEvent应改为HttpSessionEvent,一、会话生命周期事件侦听器,HttpSessionEvent类:public HttpSession getSession()/返回产生事件的会话对象HttpSessionListener接口:public void sessionCreate(HttpSessionEvent sce)/当容器生成一个HttpSession对象时,该方法被调用public void sessionDestroyed(HttpSessionEvent sce)/当容器因为超时或因为程序中显式调用了invalidate

46、()方法而销毁一个HttpSession对象时,该方法被调用,监视会话对象,4.3节,HttpSessionActivationListener接口:public void sessionDidActivate(HttpSessionEventse)/当HttpSession对象被激活时,该方法被调用public void sessionWillPassivate(HttpSessionEventse)/当HttpSession对象被钝化时,该方法被调用,一、会话生命周期事件侦听器,监视会话对象,4.3节,一、会话生命周期事件侦听器,在web.xml中部署事件侦听器:事件侦听器类的全名 实例:

47、com.mycompany.servlet.OnlineCounterListener,监视会话对象,4.3节,监视会话对象,4.3节,实例:利用会话生命周期事件实现在线人数的统计工作编程思路:当容器启动Web应用程序时,容器将创建ServletContext实例并触发contextInitialized事件,可在该事件处理方法中为ServletContext实例添加一个属性计数器变量;并将计数器变量值清零当一个用户登录网上商店时,容器将创建一个HttpSession对象实例并触发sessionCreated事件,可在该事件处理方法中将计数器变量值加1;当用户离开网上商店时,容器将销毁对应的H

48、ttpSession对象实例并触发sessionDestroyed事件,可在该事件处理方法中将计数器变量值减1。当容器终止Web应用程序运行时,容器将销毁ServletContext实例并触发contextDestroyed事件,可在该事件处理方法中删除属性计数 变量;销毁ServletContext实例,一、会话生命周期事件侦听器,监视会话对象,4.3节,注意事项:在实现HttpSessionListener侦听器接口的类中,必须重写接口的所有抽象方法:sessionCreate()、sessionDestroyed()若某个事件方法没有需要处理的内容,可以只有空方法体,但必须重写sessi

49、onCreate方法和sessionDestroyed方法的自变量参数是HttpSessionEvent,通过调用该类的getSession()方法可获取产生事件的会话对象.与ServletContextListener类似,这调用两个方法时,可能会遇到多线程同步问题。,一、会话生命周期事件侦听器,public void contextInitialized(ServletContextEvent sce)ServletContext context=sce.getServletContext();Integer counter=new Integer(0);context.setAttrib

50、ute(counter,counter);public void contextDestroyed(ServletContextEvent sce)ServletContext context=sce.getServletContext();context.removeAttribute(counter);public void sessionCreated(HttpSessionEvent se)HttpSession session=se.getSession(false);ServletContext context=session.getServletContext();Integer

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号