Chinaunix首页 | 论坛 | 博客
  • 博客访问: 25025
  • 博文数量: 25
  • 博客积分: 1010
  • 博客等级: 少尉
  • 技术积分: 270
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-22 20:04
文章分类

全部博文(25)

文章存档

2011年(1)

2009年(24)

我的朋友
最近访客

分类: Java

2009-08-14 17:21:05

第八章 Session Tacking
第一节Stateful & Stateless
Internet通讯协议可以分为两大类:StatfulStateless,两者最大的差别在于ClientServer之间维持联机上的不同。
TelentFTP而言,它们皆同属于Stateful的协议,因为当Client连接到Server端后,经由相同且持续性的联机来传达各种的操作,等待操作完毕之后,Server端才切断联机。具有Stateful协议的Server知道这些请求是来自于相同的Client端,换句话说,所谓的State是指连接状态,而Stateful的连接状态是持续性联机,并且Server将会记得每一个Client
另一方面,HTTP是一种Stateless的协议。它只关心请求与响应的状态,当Client发出请求时,Server才会建立连接,一旦Client的请求结束,Server便会中断与Client的连接,不会一直于Client保持联机的状态。对于简单的Web来说,是一个很不错的协议。
如果一个Client只是单纯地请求一个文件(HTMLGIF)Server可以响应给Client,并不须要知道一连串的请求是来自于相同的Client或是不同的Client,而且Server也不须要担心Client现在是处在连接状态还是已经断线了。但是真实世界并不是如此美好,这样的通讯协议,使得Server难以判断所连接的Client是否是同一个人。
举例说明:用户将商品加入购物车内,此时用户的请求已经结束,Server中断与用户的连接,假若当用户要进行结帐的时候,Server却不认得这次的用户是否就是刚才将商品放入购物车的人,因而无法进行结帐的动作。当我们编写web程序的时候,上述问题正是我们所关注的,我们必须想办法将相关的请求结合在一起,并且努力维持用户的状态在Server上。
第二节Session Tracking的四种方法
JSP技术中,让Web服务器能够追踪用户的状态就叫做Session TrackingSession Tacking的动作,简单的说:就是从上一个请求所传送的数据能维持状态到下一个请求,并且辨认出是相同的Client端所发送出来的。Session Tracking可以经由下列四种方式来完成:
(1)   建立含有数据的隐藏表格字段;
(2)   重写包含额外参数的URL
(3)   使用持续Cookies
(4)   使用ServletHttpSession API
前三种方式是传统做法,每种做法皆有其缺点。最后一种做法是目前最常用,也是最有效的解决方案。
1.      Session的定义
在介绍Session Tacking的方法前,我们要先对Session的定义有正确的了解。Session:即在一段时间之内,单一ClientServer之间一连串相关的交互作用。在会话之内,可以是一连串的交易。
一个会话之内也有可能包含多个请求指向同一个JSP文件,或者是请求各种不同的资源,不过,HTTPStateless的通讯协议,Server将不会知道哪个请求是属于哪个会话,因此以下有两种方法让我们解决此种情形:
(1) 可以让Client每次发出请求时能被辨认,然后我们可以储存数据及找回用户在Server端储存的相关数据。
(2) 可以传送识别的数据给Client,让Client每次发出的请求中夹带之前识别的数据,传送回来。

浏览器
(IENetscape)
浏览器
(IENetscape)
 
浏览器
(IENetscape)
 
JSP容器
(Tomcat)
JSP容器
(Tomcat)
 
JSP容器
(Tomcat)
 
给我XX网页
这是XX网页
你的Sessionid
12345
给我OO网页
我的Sessionid
12345
浏览器向服务器
请求某一个网页
服务器传回一个网页,并且传给浏览器一个cookie,它的内容包含一个Sessionid
当浏览器请求其他资源时,它会连同sessionid一起传送服务器

2.      隐藏表格字段
隐藏表格字段的方法,是利用HTMLHidden的属性,把Client的信息,
让用户不察觉的情形下,偷偷地随着请求一起传送给到Server处理,这样一来,就可以进行Session Tacking的任务了。你可以下列的方法来做隐藏字段的Session Tacking
     然后将重要的用户信息,如:ID之类独一无二的数据,以隐藏字段的方式传送给ServerServer取得此字段的值后,再将用户所传送的内容加入购物车内。隐藏字段的优点在于Session数据传送到Server端时,并不用像GET的方法,会将Session数据暴露在URL之上。缺点是Session数据储存在隐藏字段中,仍然有暴露数据的危机,因为只要用户直接观看HTML的源文件,Session数据将会暴露无疑。这将是安全漏洞,特别当用户数据是依赖用户ID、密码取得的时候,将会有被盗用的危险。
     范例:
     index.jsp
   hidden.jsp
   执行后的结果:
3.      URL重写
     隐藏字段是利用POST的方法,将Session数据传给Server;而URL重写是利用GET的方法,在URL中加入一些额外的参数来达到Session Tracking的目的。URL改写最大的特征在于可以将URL写成额外路径信息、参数或以自定义的格式来表达所要传达的信息。但是,URL在长度上有一定的限制,因此在使用上须要考虑长度的大小。
4.      Cookie
    Cookie的运作原理与前面两者不尽相同,CookieServer利用HTTP响应的表头传送一段信息给用户的浏览器,然后浏览器再将表头上有关Cookie的信息建成一个文本文件,并且把keyvalue的值储存起来,等到浏览器每次存取到这台Server时,Cookie便会随着请求传送给Server,让Server读取Cookie的信息来辨识这个用户。
5.      使用ServletSession API
    在现代技术中,传统的会话追踪方式已经稍嫌落伍,不合适宜。在Servlet发展出来的时候,就已经包含着会话的对象Session。这强大的功能使得JSP一诞生便具有会话追踪客户的能力,这个会话的对象session,事实上是javax.servlet.http.HttpSession的一个参考对象。支持ServletWeb Server利用上面探讨过的两种机制:CookieURL重写来实现session
      经由传送一个sessionIDClient端的Cookie上,接着判别Client的请求中所夹带过来的Cookie信息,来比对发送请求的用户是否为同一个人。当客户端部接受Cookie的时候,可以利用URL重写的方式将URL编码,把Session ID 编码在所欲产生页面之上URL上,此时须利用response对象内的encodeURL()encodeRedirectURL()方法,来将URL做一个编码的动作。举例来说:
应该改为:
假若你须要使用重新导向URL时,例如:
注意:
sessionIDURL的编码方式进行时,需将每一页都编码,才能保留住sessionID。如果遇到没有编码的URL,则无法进行Session Tracking
范例:
sessionCounter.jsp
     执行后的结果:
第三节Session的生命周期
sessionCookie 一样拥有特定的生命周期。一个Session可以利用isNew()方法来得知是否为一个新的session。所谓“新”的session意思是说:它已被Server产生,但是Client尚未被告知。
一般来说:session在一段时间没有作用就会自动失效,也就是Server会自动控管session失效的时间。如果需要也可以自己手动设定session过期的时间。以Tomcat5.0为例,可以在web.xml中设定session的过期时间为30分钟,如下:
还可以,使用HttpSessionsetMaxinactiveInterval()方法来设定session在一定时间内过期。还可以使用HttpSessioninvalidate()方法,使session立即失效。
范例:
执行后的结果:
    不停的刷新页面,30秒之后:
第四节HttpSessionBindingListener接口
当你在利用session的时候,有时候会遇到一些错误,如:需要在session过期时,将session数据写回数据库或文件,或者将某个负责记录用户所点击页面数据的对象加入session中。此时,你可能就需要实现javax.servlet.httpSession.BindingListener接口,此接口有两个必须实现的方法:
任何实现javax.servelt.http.HttpSessionBindingListener接口的对象,当该对象加入session时,会自动调用valueBound()方法;而当session移除时,则也会自动调用valueUnbound()
范例:
UserList.java
UserTrace.java
index.jsp
UserList.jsp
执行后的结果:
提交后:
   十秒钟刷新:
第五节Shopping Cart范例程序一
这章,我们将实现Session Tracking中最常见的一个例子:购物车范例,使用session对象来储存用户购买的东西。
范例:
index.jsp
ShowCartItems.jsp
执行后的结果:
第六节Shopping Cart范例程序二
我们再举一个功能较为完善的购物车范例:这个范例程序主要分为四个部分:Store.jspStore.javaShowstore.jsp Checkout.jspBook.java
 
功能说明
EShop.jsp
显示在线书商所提供贩卖的书籍
Cart.jsp
显示购物车的内容
Checkout.jsp
显示最后购买的物品清单和金额
Book.java
它是一个JavaBean,内容为书籍的属性:书名、作者、出版商、数量
ShoppingServlet.java
它除了新增、移除购物车内的物品和结帐的功能之外,并且也扮演流程控制的角色。它是一个Servelt
    EShop.jsp
执行后的结果:
 
                            JSP课完结
阅读(423) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~