免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1158 | 回复: 0
打印 上一主题 下一主题

java培训日志☆session [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-14 17:21 |只看该作者 |倒序浏览

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

浏览器
(IE、Netscape)

JSP容器
(Tomcat)
JSP容器
(Tomcat)

JSP容器
(Tomcat)

给我XX网页
这是XX网页
你的Sessionid
为12345
给我OO网页
我的Sessionid
为12345
浏览器向服务器
请求某一个网页
服务器传回一个网页,并且传给浏览器一个cookie,它的内容包含一个Sessionid
当浏览器请求其他资源时,它会连同sessionid一起传送服务器
2.      隐藏表格字段
隐藏表格字段的方法,是利用HTML内Hidden的属性,把Client的信息,
让用户不察觉的情形下,偷偷地随着请求一起传送给到Server处理,这样一来,就可以进行Session Tacking的任务了。你可以下列的方法来做隐藏字段的Session Tacking:
     然后将重要的用户信息,如:ID之类独一无二的数据,以隐藏字段的方式传送给Server,Server取得此字段的值后,再将用户所传送的内容加入购物车内。隐藏字段的优点在于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的运作原理与前面两者不尽相同,Cookie是Server利用HTTP响应的表头传送一段信息给用户的浏览器,然后浏览器再将表头上有关Cookie的信息建成一个文本文件,并且把key和value的值储存起来,等到浏览器每次存取到这台Server时,Cookie便会随着请求传送给Server,让Server读取Cookie的信息来辨识这个用户。
5.      使用ServletSession API
    在现代技术中,传统的会话追踪方式已经稍嫌落伍,不合适宜。在Servlet发展出来的时候,就已经包含着会话的对象Session。这强大的功能使得JSP一诞生便具有会话追踪客户的能力,这个会话的对象session,事实上是javax.servlet.http.HttpSession的一个参考对象。支持Servlet的Web Server利用上面探讨过的两种机制:Cookie和URL重写来实现session。
      经由传送一个session的ID到Client端的Cookie上,接着判别Client的请求中所夹带过来的Cookie信息,来比对发送请求的用户是否为同一个人。当客户端部接受Cookie的时候,可以利用URL重写的方式将URL编码,把Session ID 编码在所欲产生页面之上URL上,此时须利用response对象内的encodeURL()或encodeRedirectURL()方法,来将URL做一个编码的动作。举例来说:
应该改为:
假若你须要使用重新导向URL时,例如:
注意:
sessionIDURL的编码方式进行时,需将每一页都编码,才能保留住sessionID。如果遇到没有编码的URL,则无法进行Session Tracking
范例:
sessionCounter.jsp
     执行后的结果:
第三节Session的生命周期
session与Cookie 一样拥有特定的生命周期。一个Session可以利用isNew()方法来得知是否为一个新的session。所谓“新”的session意思是说:它已被Server产生,但是Client尚未被告知。
一般来说:session在一段时间没有作用就会自动失效,也就是Server会自动控管session失效的时间。如果需要也可以自己手动设定session过期的时间。以Tomcat5.0为例,可以在web.xml中设定session的过期时间为30分钟,如下:
还可以,使用HttpSession的setMaxinactiveInterval()方法来设定session在一定时间内过期。还可以使用HttpSession的invalidate()方法,使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.jsp、Store.java、Showstore.jsp 、Checkout.jsp、Book.java
名  称
功能说明
EShop.jsp
显示在线书商所提供贩卖的书籍
Cart.jsp
显示购物车的内容
Checkout.jsp
显示最后购买的物品清单和金额
Book.java
它是一个JavaBean,内容为书籍的属性:书名、作者、出版商、数量
ShoppingServlet.java
它除了新增、移除购物车内的物品和结帐的功能之外,并且也扮演流程控制的角色。它是一个Servelt
    EShop.jsp




执行后的结果:

                            JSP课完结

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/101620/showart_2027535.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP