使用会话追踪(sessiontracking).ppt_第1页
使用会话追踪(sessiontracking).ppt_第2页
使用会话追踪(sessiontracking).ppt_第3页
使用会话追踪(sessiontracking).ppt_第4页
使用会话追踪(sessiontracking).ppt_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9章 使用会话追踪(session tracking),9.1 会话与会话追踪,Internet通信协议可以分为两大类:有连接协议和无连接协议,两者的最大差别在于客户端和服务器端之间维持联机上的不同。 session的引入: 鉴于http是无状态的协议,当完成客户端和服务器的传递信息后,就断开之间的联系,这样就造成了怎么样在几个页面之间传递信息的问题. 我们Jsp程序中很多参数需要从数据库中读取,有的参数实际读取一次就可以,如果设计成每个用户每产生一个页面都要读取数据库,很显然,数据库的负载很大,同时也浪费时间,虽然可能有数据库连接池优化,但是尽量少使用数据库是我们编程的原则. Session,中文经常翻译为“会话”。 session tracking(会话追踪)是指一类用来客户端与服务器之间保持状态的解决方案,简单地说,当一个客户在多个页面间切换时,服务器会保存该用户的信息。,9.2 实现会话追踪的4种方式,(1)使用持续Cookies(Persistent Cookie) (2) 使用包含额外参数的URL(URL Rewriting)。 (3)建立含有数据的隐藏表单字段(Hidden Form Field)。 (4)使用内建session 对象。 相对于安全级别来说第四种最高了,session是指在一段时间内客户端和服务器之间的一连串的相关的交互过程。,下面这段代码先将会话信息记录在HashMap中,保存在服务器端,并用sessionID标识,然后把sessionID保存在名为“JSESSIONID”的Cookie中。 用户请求到达服务器后,先从Cookie中取出sessionID,然后从HashMap中取出会话信息。这样就实现了会话追踪。 虽然Cookie强大且持续性高,但是由于有些用户因为担心Cookie对个人隐私的威胁,会关闭Cookie,一旦如此,便无法利用Cookie来达到会话追踪的功能。,9.2.1 使用Cookie,Cookie是一个小小的文本文件,它是将会话信息记录在这个文本文件内,每个页面都去Cookie中提取以前的会话信息 String sessionID=makeUniqueString();/是用来产生唯一的 session id HashMap sessionInfo=new HashMap(); HashMap globaTable=findTableStoringSessions(); globeTable.put(sessionID,sessionInfo); Cookie sessionCookie=new Cookie(“JSESSION“,sessionID); sessionCookie setPath(“/”); response.addCookie(sessionCookie);,9.2.2 URL重写,URL重写是利用GET的方法,在URL的尾部添加一些额外的参数来达到会话追踪(session tracking)的目的,服务器将这个标识符与它所存储的有关会话的数据关联起来。URL看起来如下: http:/host/path/file.html;jsessionid=1234, 使用URL重写的优点是Cookie被禁用或者根本不支持的情况下依旧能够工作。但也有很多缺点: 必须对所有指向您的网站的URL进行编码。 所有页面必须动态生成。 不能使用预先记录下来的URL进行访问,或者从其他网站链接进行访问。,9.2.3 隐藏表单字段,隐藏表单字段的方法,是利用HTML内Hidden的属性,把客户端的信息,在用户不察觉的情形下,偷偷地随着请求一起传送给到服务器处理,这样一来,就可以进行会话跟踪的任务了。可以下列的方法来做隐藏表单字段的会话追踪。 ,9.2.4 使用内建session对象,传统的会话追踪方式使用比较麻烦,JSP使用内建的session对象可以非常方便地实现会话追踪,JSP的会话机制基于Cookie或URL重写技术,融合了这两种技术的优点,当客户端允许使用Cookie时,内建session对象使用Cookie进行会话追踪,如果客户端禁用Cookie,则选择使用URL重写。,(1)获取session对象 例如把购物车作为属性存储在session中,在其他JSP页面中可以通过session再获得购物车。 / 在JSP页面中可以直接使用session ShoppingCart cart = (ShoppingCart)session.getAttribute(“cart“); 内建的session对象是javax.servlet.http. HttpSession类的实例,如果在JavaBean或者Servlet中使用session就需要先从当前的request对象中取得,例如: / 得到用户session和购物篮 HttpSession session = request.getSession(); ShoppingCart cart = (ShoppingCart)session.getAttribute(“cart“);,(2)读写session中的数据 向session中存入对象使用setAttribute方法,通过getAttribute方法读取对象。从session返回的值注意要转换成合适的类型,要注意检查结果是否为null。例如下面一段代码: HttpSession session = request.getSession(); SomeClass value = (SomeClass)session.getAttribute(“someID“); if (value = null) value = new SomeClass(.); session.setAttribute(“someID“, value); doSomethingWith(value);,(3)废弃session数据 调用removeAttribute废弃session中的值,即移除与名称关联的值。 调用invalidate废弃整个session,即废弃当前的session。 如果用户注销离开站点,注意废弃与用户相关联的所有session。 (4)session的生命周期 由于没有办法知道HTTP客户端是否不再需要session,因此每个session都关联一个时间期限使它的资源可以被回收。但是这一部分的具体内容将在9.3节中进行详细的介绍。,(5)服务器使用URL重写 session默认使用Cookie技术进行会话追踪,如果客户端不接受Cookie的时候,服务器可以利用URL重写的方式将sessionID作为参数附在URL后面,此时须利用response对象内的encodeURL或encodeRedirectURL方法,这两个方法首先判断Cookies是否被浏览器支持;如果支持,则参数URL被原样返回,session ID将通过Cookies来维持。否则返回带有sessionID的URL。,下面是使用encodeURL方法的示例,两个文件hello1.jsp和hello2.jsp。 hello1.jsp的完整程序代码如下: 进入到hello2.jsp,hello1.jsp利用了response对象内的encodeURL方法,将URL做了一个编码动作。其实就是把 进入到hello2.jsp 改为: 进入到hello2.jsp 若要使用重定向,例如: response.sendRedirect(“hello2.jsp“); 也应该改为: response.encodeRedirectURL(“hello2.jsp“);,同时需要注意的是,将session的ID以URL的编码方式进行时,需将每一页都编码,才能保留住session的ID。如果遇到没有编码的URL,则无法进行会话跟踪。 hello2.jsp的完整程序代码如下: ,可以看到如果服务器使用URL重写,它将会话信息附加到URL上,如下所示: http:/localhost:8080/ch09/hello2.jsp;jsessionid=A09F3A5583825EE787580106CC62A1E8,(6)内建session对象使用示例 下面是一个记录同一用户到站次数的计数器,该实例包含一个文件sessionCounter.jsp。 sessionCounter.jsp记录单一用户每次光临的次数。首先,从session内取出accessCount的值,如果值为null时,代表用户第一次光临,就将accessCount设为0,将heading设为“Welcome, Newcomer”,如果值不为null,则把accessCount的值加1,将heading设为“Welcome Back”。 sessionCounter.jsp的初次执行结果如图9-3所示。 图9-3 sessionCounter.jsp的初次执行效果 sessionCounter.jsp的多次执行结果如图9-4所示。 图9-4 sessionCounter.jsp的多次执行效果,9.3 内建session对象的生命周期,内建session对象和cookie一样拥有特定的生命周期。一般来说,内建session对象在一段时间没有作用就会自动失效,也就是服务器会自动控管session失效时间。除此之外,也可以显式地通过HttpSession类的setMaxInactiveInterval()方法为每个单独的session对象设置失效时间。如果不使用这个方法,默认的失效时间便由系统指定。另外也可以使用HttpSession类的invalidate()方法,session不论多久的时间为过期,将立即失效。,9.3.1 在web.xml中配置内建session对象的过期时间,但是 session-config和session-timeout元素可以显式用来在所有服务器上指定失效时间。时间单位是分钟,所以下面的示例设置了session对象默认的失效时间是3个小时(180分钟)。 180 session-config设置session失效时间的方法和使用HttpSession类中的setMaxInactiveInterval方法有两个细微的差别。首先,session-time子元素定义的时间值单位是分钟,然而setMaxInactiveInterval定义的值单位是秒。其次,如果session-timeout指定的值是0或负数,session将不会失效,但是setMaxInactiveInterval方法要达到同样的结果,只能设置负数。,9.3.2设置内建session对象的过期时间,在服务器上,通过为站点上的用户创建 session对象保存该用户的信息。当一个客户首次访问服务器上的一个JSP页面时,JSP引擎产生一个session对象,同时分配一个String类型的ID号,JSP引擎同时将这个ID号发送到客户端,存放在Cookie中,这样session对象和客户之间就建立了一一对应的关系。当客户再访问连接该服务器的其他页面时,不再分配给客户新的session对象,直到客户关闭浏览器后,服务器端该客户的session对象才取消,并且和客户的会话对应关系消失。当客户重新打开浏览器再连接到该服务器时,服务器为该客户再创建一个新的session对象。 一个session可以利用isNew方法来得知是否为一个新的session。 由于没有办法知道HTTP客户端是否不再需要session,因此每个session都关联一个时间期限使它的资源可以被回收。,sessionLife.jsp实例介绍如何手动控制session的过期时间,以节省服务器资源。,9.4 使用HttpSessionBinndingListener接口监听session对象的事件,在Servlet中,传入Session的对象如果是一个实现HttpSessionBindingListener接口的对象(方便起见

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论