??xml version="1.0" encoding="utf-8" standalone="yes"?>
看到个文?转到q里~
原文地址:http://www.iamwinter.com/article.asp?id=238
一、AJAX开发者的最新工具和技?br />
ZXML的异步JavaScriptQ简UAJAXQ是当前Web创新Q称为Web2.0Q中的一个王冠。感谢组成AJAX的各U技术,Web应用的交互如Flickr, Backpack?a target="_blank">Google在这斚w已经有质的飞跃。这个术语源自描qCZ|页的Web应用到基于数据的应用的{换。在Z数据的应用中Q用户需求的数据如联pMh列表Q可以从独立于实际网늚服务端取得ƈ且可以被动态地写入|页中,l缓慢的Web应用体验着色之像桌面应用一栗?br />
虽然大部分开发h员在q去使用qXMLHttp或者用Iframe来加载数据,但仅到现在我们才看到传统的开发h员和公司开始采用这些技术。就像新的编E语a或模型伴随着更多的痛苦,开发h员需要学习新的技巧及如何最好利用这些新技术?br />
二、AJAX模式
许多重要的技术和AJAX开发模式可以从现有的知识中获取。例如,在一个发送请求到服务端的应用中,必须包含h序、优先、超时响应、错误处理及回调Q其中许多元素已l在Web服务中包含了Q就像现在的SOA。AJAX开发h员拥有一个完整的pȝ架构知识。同Ӟ随着技术的成熟q会有许多地斚w要改q,特别是UI部分的易用性?br />
AJAX开发与传统的CS开发有很大的不同。这些不同引入了新的~程问题Q最大的问题在于易用性。由于AJAX依赖览器的JavaScript和XMLQ浏览器的兼Ҏ和支持的标准也变得和JavaScript的运行时性能一样重要了。这些问题中的大部分来源于浏览器、服务器和技术的l合Q因此必ȝ解如何才能最好的使用q些技术?br />
l合各种变化的技术和合的客h务端环境QAJAX提出了一U新的开发方式。AJAX开发h员必ȝ解传l的MVC架构Q这限制了应用层ơ之间的边界。同Ӟ开发h员还需要考虑CS环境的外部和使用AJAX技术来重定型MVC边界。最重要的是QAJAX开发h员必ȝ止以面集合的方式来考虑Web应用而需要将其认为是单个面。一旦UI设计与服务架构之间的范围被严格区分开来后Q开发h员就需要更新和变化的技术集合了?br />
三、时L着用户
AJAX的最大机遇在于用户体验。在使应用更快响应和创新的过E中Q定义Web应用的规则正在被重写Q因此开发h员必L注重用户。现在用户已l逐渐习惯如何使用Web应用了。例如用户通常希望每一ơ按钮点MD几秒的gq和屏幕hQ但AJAX正在打破q种长时间的状况。因此用户需要重C验按钮点ȝ响应了?br />
可用性是AJAX另hȀ动的地方而且已经产生了几U新颖的技术。其中最引h注目的是一U称?#8220;黄色隐出”的技术,他在数据更新之前时将用户界面变ؓ黄色Q更新完成后立刻恢复原来的颜艌ӀAJAX开发h员将用户从Web应用的负载中解放出来Q小心地利用AJAX提供的丰富接口,不久桌面开发h员会发现AJAX是他们的方向?br />
四、几U工具和技?br />
随着AJAXq速地引h注目hQ我惛_发h员对q种技术的期待也迅速地增加。就像Q何新技术,AJAX的兴Z需要一整个开发工?~程语言及相x术系l来支撑?br />
Q、JavaScript
如名字所CAJAX的概念中最重要而最被忽视的是他也是一UJavaScript~程语言。JavaScript是一U粘合剂使AJAX应用的各部分集成在一赗在大部分时_JavaScript通常被服务端开发h员认为是一U企业应用不需要用的东西应该力避免。这U观Ҏ来自以前~写JavaScript代码的经历:J杂而又易出错的语言。类似的Q他也被认ؓ应用逻辑L地散布在服务端和客户端中Q这使得问题很难被发现而且代码很难重用。在AJAX中JavaScript主要被用来传递用L面上的数据到服务端ƈq回l果。XMLHttpRequest对象用来响应通过HTTP传递的数据Q一旦数据返回到客户端就可以立刻使用DOM数据放到网面上?br />
Q、XMLHttpRequest
XMLHttpRequest对象在大部分览器上已经实现而且拥有一个简单的接口允许数据从客L传递到服务端,但ƈ不会打断用户当前的操作。用XMLHttpRequest传送的数据可以是Q何格式,虽然从名字上是XML格式的数据?br />
开发h员应该已l熟悉了许多其他XML相关的技术。XPath可以讉KXML文档中的数据Q但理解XML DOM是必ȝ。类似的QXSLT是最单而快速的从XML数据生成HTML或XML的方式。许多开发h员已l熟悉Xpath和XSLTQ因此AJAX选择XML作ؓ数据交换格式有意义的。XSLT可以被用在客L和服务端Q他能够减少大量的用JavaScript~写的应用逻辑?br />
Q、CSS
Z正确的浏览AJAX应用QCSS是一UAJAX开发h员所需要的重要武器。CSS提供了从内容中分d用样式和设计的机制。虽然CSS在AJAX应用中扮演至关重要的角色Q但他也是构建创览器应用的一大阻,因ؓ不同的浏览器厂商支持各种不同的CSSU别?br />
五、服务器?br />
但不像在客户端,在服务端AJAX应用q是使用建立在如Java,.Net和PHP语言基础上机Ӟq没有改变这个领域中的主要方式?br />
既然如此Q我们对Ruby on Rails框架的兴也p速增加了。在一q多前,Ruby on Rails已经吸引了大量开发h员基于其强大功能来构建Web和AJAX应用。虽然目前还有很多快速应用开发工具存在,Ruby on Rails看v来已l储备了化构建AJAX应用的能力?br />
六、开发工?br />
在实际构建AJAX应用中,你需要的不只是文本编辑器。既然是JavaScript非编译的Q他可以Ҏ地编写和q行在浏览器中;然而,许多工具提供了有用的扩展如语法高亮和完成?br />
不同的IDE提供了对JavaScript支持的不同等U。来自JetBrains的IntelliJ IDEA是一个用来JavaScript开发的更好的IDEQ虽然许多开发h员也喜欢Microsoft’s Visual Studio产品Q允Z在最新的版本中改善对AJAX的支持)。Eclipse包含了两个免费的JavaScript~辑器插件和一个商业的来自ActiveStat的Komodo IDE?br />
另一个JavaScript和AJAX开发中的问题是调试困难。不同的览器提供不同的通常是隐藏的q行旉误信息,而JavaScript的缺陷如双重变量赋|通常是由于缺数据类型)使得调试更加困难。在AJAX的开发中Q调试就更复杂了Q因为其需要标识究竟是客户端还是服务端产生的错误。在q去QJavaScript调试的方法是删除所有代码然后一行行的增加直到错误出现。现在,更多开发h员回CؓIE准备的Microsoft Script Debugger和ؓMozilla览器准备的Venkman?br />
七、浏览器兼容?br />
JavaScript~程的最大问题来自不同的览器对各种技术和标准的支持。构Z个运行在不同览器(如IE和火狐)是一个困隄d。因此几UAJAX JavaScript框架或者生成基于服务端逻辑或标记库的JavaScriptQ或者提供符合跨览器AJAX开发的客户端JavaScript库。一些流行的框架包括QAJAX.Net, Backbase, Bitkraft, Django, DOJO, DWR, MochiKit, Prototype, Rico, Sajax, Sarissa, and Script.aculo.us.
q些框架l开发h员更多的I间使得他们不需要担心跨览器的问题。虽然这些框架提升了开发h员构建应用的能力Q但׃厂商已经开发了更细节的用户界面的打包组件解x案,因此在AJAXlg市场中需要考虑一些其他因素。例如提供通用用户界面的组件如l合框和数据栅格的几个厂商,都可以被用来在应用中创徏良好的通过cM电子数据表方式来查看和编辑数据的体验。但q些lg不仅是封装了lg的用L面而且包括与服务端数据的通讯方式Q这些组仉常使用Z标记方式来实现如ASP.Net或JSF控g?br />
八、展?br />
最qIE和火狐之间的览器之争变得火热v来,因此AJAX开发h员需要够敏L作出反应。关键点在一些问题如CSS或XMLQ虽然各U浏览器形成采用最新标准的不同阵营Q如Mozilla拥抱SVG和E4X标准及在最新火狐BETA版本中用XULQ?a target="_blank">微Y使用自己的XAML技术)。所有这些技术代表当前AJAXLJavaScript和XML的市场方向改变?br />
ȝ来说QAJAX开发h员必d快地跟进最新的技术ƈ利用高的工具集。成功的AJAX开发h员还需要留心他们的使用者以避免Q何问题扩大化。ƈ且AJAX开发h员还需要持l地创新来创建增强Web应用易用性的新方法?
摘要Q虽然session机制在web应用E序中被采用已经很长旉了,但是仍然有很多h不清楚session机制的本质,以至不能正确的应用这一技术。本文将详细讨论session的工作机制ƈ且对在Java web application中应用session机制时常见的问题作出解答?/p>
目录Q?br />一、术语session
二、HTTP协议与状态保?br />三、理解cookie机制
四、理解session机制
五、理解javax.servlet.http.HttpSession
六、HttpSession常见问题
七、跨应用E序的session׃n
八、ȝ
参考文?/p>
一、术语session
在我的经验里Qsessionq个词被滥用的程度大概仅ơ于transactionQ更加有的是transaction与session在某些语境下的含义是相同的?/p>
sessionQ中文经常翻译ؓ会话Q其本来的含义是指有始有l的一pd动作/消息Q比如打电话时从拿v电话拨号到挂断电话这中间的一pdq程可以UCZ个session。有时候我们可以看到这L话“在一个浏览器会话期间Q?..”,q里的会话一词用的就是其本义Q是指从一个浏览器H口打开到关闭这个期间①。最混ؕ的是“用P客户端)在一ơ会话期间”这样一句话Q它可能指用L一pd动作Q一般情况下是同某个具体目的相关的一pd动作Q比如从d到选购商品到结账登样一个网上购物的q程Q有时候也被称Z个transactionQ,然而有时候也可能仅仅是指一ơ连接,也有可能是指含义①,其中的差别只能靠上下文来推断②?/p>
然而当session一词与|络协议相关联时Q它又往往隐含了“面向连接”和/或“保持状态”这样两个含义,“面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到Ҏ接了电话通信才能开始,与此相对的是写信Q在你把信发出去的时候你q不能确认对方的地址是否正确Q通信渠道不一定能建立Q但对发信h来说Q通信已经开始了。“保持状态”则是指通信的一方能够把一pd的消息关联v来,使得消息之间可以互相依赖Q比如一个服务员能够认出再次光的老顾客ƈ且记得上ơ这个顾客还Ơ店里一块钱。这一cȝ例子有“一个TCP session”或者“一个POP3 session”③?/p>
而到了web服务器蓬勃发展的时代Qsession在web开发语境下的语义又有了新的扩展Q它的含义是指一cȝ来在客户端与服务器之间保持状态的解决Ҏ④。有时候session也用来指q种解决Ҏ的存储结构,如“把xxx保存在session里”⑤。由于各U用于web开发的语言在一定程度上都提供了对这U解x案的支持Q所以在某种特定语言的语境下Qsession也被用来指代该语a的解x案,比如l常把Java里提供的 javax.servlet.http.HttpSessionUCؓsession⑥?/p>
鉴于q种混ؕ已不可改变,本文中session一词的q用也会Ҏ上下文有不同的含义,请大家注意分辨?br />在本文中Q用中文“浏览器会话期间”来表达含义①,使用“session机制”来表达含义④,使用“session”表辑义⑤Q用具体的“HttpSession”来表达含义?/p>
二、HTTP协议与状态保?/strong>
然而聪明(或者贪心?Q的Z很快发现如果能够提供一些按需生成的动态信息会使web变得更加有用Q就像给有线电视加上Ҏ功能一栗这U需求一斚wqHTML逐步d了表单、脚本、DOM{客L行ؓQ另一斚w在服务器端则出现了CGI规范以响应客L的动态请求,作ؓ传输载体?HTTP协议也添加了文g上蝲、cookieq些Ҏ。其中cookie的作用就是ؓ了解决HTTP协议无状态的~陷所作出的努力。至于后来出现的 session机制则是又一U在客户端与服务器之间保持状态的解决Ҏ?/p>
让我们用几个例子来描qC下cookie和session机制之间的区别与联系。笔者曾l常ȝ一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠Q然而一ơ性消?杯咖啡的Z微乎其微Q这时就需要某U方式来U录某位֮的消Ҏ量。想象一下其实也无外乎下面的几种ҎQ?br />1、该店的店员很厉宻I能记住每位顾客的消费数量Q只要顾客一走进咖啡店,店员q道该怎么对待了。这U做法就是协议本w支持状态?br />2、发l顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每ơ消ҎQ如果顾客出C张卡片,则此ơ消费就会与以前或以后的消费相联pv来。这U做法就是在客户端保持状态?br />3、发l顾客一张会员卡Q除了卡号之外什么信息也不纪录,每次消费Ӟ如果֮出示该卡片,则店员在店里的纪录本上找到这个卡号对应的U录d一些消费信息。这U做法就是在服务器端保持状态?/p>
׃HTTP协议是无状态的Q而出于种U考虑也不希望使之成ؓ有状态的Q因此,后面两种Ҏ成为现实的选择。具体来说cookie机制采用的是在客L保持状态的ҎQ而session机制采用的是在服务器端保持状态的Ҏ。同时我们也看到Q由于采用服务器端保持状态的Ҏ在客L也需要保存一个标识,所以session机制可能需要借助于cookie机制来达C存标识的目的Q但实际上它q有其他选择?/p>
三、理解cookie机制
正统的cookie分发是通过扩展HTTP协议来实现的Q服务器通过在HTTP的响应头中加上一行特D的指示以提C浏览器按照指示生成相应的cookie。然而纯_的客户端脚本如JavaScript或者VBScript也可以生成cookie?/p>
而cookie的用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器查所有存储的cookieQ如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置Q则把该cookie附在h资源的HTTPh头上发送给服务器。意思是麦当劳的会员卡只能在麦当劳的店里出示Q如果某家分店还发行了自q会员卡,那么q这家店的时候除了要出示麦当劳的会员卡,q要出示q家店的会员卡?/p>
cookie的内容主要包括:名字Q|q期旉Q\径和域?br />其中域可以指定某一个域比如.google.comQ相当于d招牌Q比如宝z公司,也可以指定一个域下的具体某台机器比如www.google.com或者froogle.google.comQ可以用飘柔来做比?br />路径是跟在域名后面的URL路径Q比?或?foo{等Q可以用某飘柔专柜做比?br />路径与域合在一起就构成了cookie的作用范围?br />如果不设|过期时_则表C个cookie的生命期为浏览器会话期间Q只要关闭浏览器H口Qcookie消׃。这U生命期为浏览器会话期的 cookie被称Z话cookie。会话cookie一般不存储在硬盘上而是保存在内存里Q当然这U行为ƈ不是规范规定的。如果设|了q期旉Q浏览器׃把cookie保存到硬盘上Q关闭后再次打开览器,q些cookie仍然有效直到过讑֮的过期时间?/p>
存储在硬盘上的cookie可以在不同的览器进E间׃nQ比如两个IEH口。而对于保存在内存里的cookieQ不同的览器有不同的处理方式。对于IEQ在一个打开的窗口上按Ctrl-NQ或者从文g菜单Q打开的窗口可以与原窗口共享,而用其他方式新开的IEq程则不能共享已l打开的窗口的内存cookieQ对于Mozilla Firefox0.8Q所有的q程和标{N都可以共享同Lcookie。一般来说是用javascript的window.open打开的窗口会与原H口׃n内存cookie。浏览器对于会话cookie的这U只认cookie不认人的处理方式l常l采用session机制的web应用E序开发者造成很大的困扰?/p>
下面是一个goolge讄cookie的响应头的例?br />HTTP/1.1 302 Found
四、理解session机制
当程序需要ؓ某个客户端的h创徏一个session的时候,服务器首先检查这个客L的请求里是否已包含了一个session标识 - UCؓsession idQ如果已包含一个session id则说明以前已lؓ此客L创徏qsessionQ服务器按照session id把这个session索出来用(如果索不刎ͼ可能会新Z个)Q如果客Lh不包含session idQ则为此客户端创Z个sessionq且生成一个与此session相关联的session idQsession id的值应该是一个既不会重复Q又不容易被扑ֈ规律以仿造的字符Ԍq个session id被在本ơ响应中q回l客L保存?/p>
保存q个session id的方式可以采用cookieQ这样在交互q程中浏览器可以自动的按照规则把q个标识发挥l服务器。一般这个cookie的名字都是类g SEEESIONIDQ而。比如weblogic对于web应用E序生成的cookieQJSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764Q它的名字就?JSESSIONID?/p>
׃cookie可以被h为的止Q必L其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一U技术叫做URL重写Q就是把session id直接附加在URL路径的后面,附加方式也有两种Q一U是作ؓURL路径的附加信息,表现形式为http://...../xxx; jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764 另一U技术叫做表单隐藏字Dc就是服务器会自动修改表单,d一个隐藏字D,以便在表单提交时能够把session id传递回服务器。比如下面的表单 在谈论session机制的时候,常常听到q样一U误解“只要关闭浏览器Qsession消׃”。其实可以想象一下会员卡的例子,除非֮d对店家提出销卡,否则店家l对不会L删除֮的资料。对session来说也是一LQ除非程序通知服务器删除一个sessionQ否则服务器会一直保留,E序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会d在关闭之前通知服务器它要关闭Q因此服务器Ҏ不会有机会知道浏览器已经关闭Q之所以会有这U错觉,是大部分session机制都用会话cookie来保存session idQ而关闭浏览器后这个session id消׃Q再ơ连接服务器时也无法找到原来的session。如果服务器讄的cookie被保存到盘上,或者用某U手D|写浏览器发出?HTTPh_把原来的session id发送给服务器,则再ơ打开览器仍然能够找到原来的session?/p>
恰恰是由于关闭浏览器不会Dsession被删除,q服务器ؓseesion讄了一个失效时_当距dL上一ơ用session的时间超q这个失效时间时Q服务器可以认为客L已经停止了活动,才会把session删除以节省存储空间?/p>
五、理解javax.servlet.http.HttpSession
首先QWeblogic Server提供了一pd的参数来控制它的HttpSession的实玎ͼ包括使用cookie的开关选项Q用URL重写的开关选项Qsession持久化的讄Qsession失效旉的设|,以及针对cookie的各U设|,比如讄cookie的名字、\径、域Qcookie的生存时间等?/p>
一般情况下Qsession都是存储在内存里Q当服务器进E被停止或者重启的时候,内存里的session也会被清I,如果讄?session的持久化Ҏ,服务器就会把session保存到硬盘上Q当服务器进E重新启动或q些信息能够被再次使用QWeblogic Server支持的持久性方式包括文件、数据库、客Lcookie保存和复制?/p>
复制严格说来不算持久化保存,因ؓsession实际上还是保存在内存里,不过同样的信息被复制到各个cluster内的服务器进E中Q这样即使某个服务器q程停止工作也仍然可以从其他q程中取得session?/p>
cookie生存旉的设|则会媄响浏览器生成的cookie是否是一个会话cookie。默认是使用会话cookie。有兴趣的可以用它来试验我们在第四节里提到的那个误解?/p>
cookie的\径对于web应用E序来说是一个非帔R要的选项QWeblogic Server对这个选项的默认处理方式得它与其他服务器有明昄区别。后面我们会专题讨论?/p>
关于session的设|参考[5] http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036869
六、HttpSession常见问题
׃session会消耗内存资源,因此Q如果不打算使用sessionQ应该在所有的JSP中关闭它?/p>
2、session何时被删?br />l合前面的讨论,session在下列情况下被删除a.E序调用HttpSession.invalidate();或b.距离上一ơ收到客L发送的session id旉间隔过了session的超时设|?或c.服务器进E被停止Q非持久sessionQ?/p>
3、如何做到在览器关闭时删除session 4、有个HttpSessionListener是怎么回事 5、存攑֜session中的对象必须是可序列化的?br />不是必需的。要求对象可序列化只是ؓ了session能够在集中被复制或者能够持久保存或者在必要时server能够暂时把session交换出内存。在Weblogic Server的session中放|一个不可序列化的对象在控制C会收C个警告。我所用过的某个iPlanet版本如果session中有不可序列化的对象Q在session销毁时会有一个ExceptionQ很奇怪?/p>
6、如何才能正的应付客户端禁止cookie的可能?br />Ҏ有的URL使用URL重写Q包括超链接Qform的actionQ和重定向的URLQ具体做法参见[6] 7、开两个览器窗口访问应用程序会使用同一个sessionq是不同的session 8、如何防止用h开两个览器窗口操作导致的session混ؕ 9、ؓ什么在Weblogic Server中改变session的值后要重新调用一ơsession.setValue 10、ؓ什么session不见?br />排除session正常失效的因素之外,服务器本w的可能性应该是微乎其微的,虽然W者在 iPlanet6SP1加若q补丁的Solaris版本上倒也遇到q;览器插件的可能性次之,W者也遇到q?721插g造成的问题;理论上防火墙或者代理服务器在cookie处理上也有可能会出现问题?br />出现q一问题的大部分原因都是E序的错误,最常见的就是在一个应用程序中去访问另外一个应用程序。我们在下一节讨个问题?/p>
七、跨应用E序的session׃n 然而按照Servlet规范Qsession的作用范围应该仅仅限于当前应用程序下Q不同的应用E序之间是不能够互相讉KҎ?session的。各个应用服务器从实际效果上都遵守了q一规范Q但是实现的l节却可能各有不同,因此解决跨应用程序session׃n的方法也各不相同?/p>
首先来看一下Tomcat是如何实现web应用E序之间session的隔ȝQ从Tomcat讄的cookie路径来看Q它对不同的应用E序讄的cookie路径是不同的Q这样不同的应用E序所用的session id是不同的Q因此即使在同一个浏览器H口里访问不同的应用E序Q发送给服务器的session id也可以是不同的?br />
Ҏq个Ҏ,我们可以推测Tomcat中session的内存结构大致如下?br />
W者以前用q的iPlanet也采用的是同L方式Q估计SunONE与iPlanet之间不会有太大的差别。对于这U方式的服务器,解决的思\很简单,实际实行h也不难。要么让所有的应用E序׃n一个session idQ要么让应用E序能够获得其他应用E序的session id?/p>
iPlanet中有一U很单的Ҏ来实现共享一个session idQ那是把各个应用程序的cookie路径都设?Q实际上应该?NASAppQ对于应用程序来讲它的作用相当于根)?br /><session-info> 需要注意的是,操作׃n的session应该遵@一些编E约定,比如在session attribute名字的前面加上应用程序的前缀Q得setAttribute("name", "neo")变成setAttribute("app1.name", "neo")Q以防止命名I间冲突Q导致互相覆盖?/p>
我们再看一下Weblogic Server是如何处理session的?br />
从截屏画面上可以看到Weblogic ServerҎ有的应用E序讄的cookie的\径都?Q这是不是意味着在Weblogic Server中默认的可以共享session了呢Q然而一个小实验卛_证明即不同的应用程序用的是同一个sessionQ各个应用程序仍然只能访问自己所讄的那些属性。这说明Weblogic Server中的session的内存结构可能如?br />
对于q样一U结构,在session机制本n上来解决session׃n的问题应该是不可能的了。除了借助于第三方的力量,比如使用文g、数据库、JMS或者客LcookieQURL参数或者隐藏字D늭手段Q还有一U较为方便的做法Q就是把一个应用程序的session攑ֈ ServletContext中,q样另外一个应用程序就可以从ServletContext中取得前一个应用程序的引用。示例代码如下, 应用E序A 应用E序B 值得注意的是q种用法不可ULQ因为根据ServletContext的JavaDocQ应用服务器可以处于安全的原因对于context.getContext("/appA");q回I|以上做法在Weblogic Server 8.1中通过?/p>
那么Weblogic ServerZ么要把所有的应用E序的cookie路径都设?呢?原来是ؓ了SSOQ凡是共享这个session的应用程序都可以׃n认证的信息。一个简单的实验可以证明这一点,修改首先d的那个应用程序的描述Wweblogic.xmlQ把cookie路径修改?appA讉K另外一个应用程序会重新要求dQ即使是反过来,先访问cookie路径?的应用程序,再访问修改过路径的这个,虽然不再提示dQ但是登录的用户信息也会丢失。注意做q个实验时认证方式应该用FORMQ因为浏览器和web服务器对basic认证方式有其他的处理方式Q第二次h的认证不是通过session来实现的。具体请参看[7] secion 14.8 AuthorizationQ你可以修改所附的CZE序来做q些试验?/p>
八、ȝ
HTTP协议本n是无状态的Q这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器h下蝲某些文gQ无论是客户端还是服务器都没有必要纪录彼此过ȝ行ؓQ每一ơ请求之间都是独立的Q好比一个顾客和一个自动售货机或者一个普通的Q非会员Ӟ大卖Z间的关系一栗?/p>
cookie机制的基本原理就如上面的例子一L单,但是q有几个问题需要解冻I“会员卡”如何分发;“会员卡”的内容Q以及客户如何用“会员卡”?/p>
Location: http://www.google.com/intl/zh-CN/
Set-Cookie: PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com
Content-Type: text/html
q是使用HTTPLookq个HTTP Sniffer软g来俘LHTTP通讯U录的一部分
览器在再次讉Kgoolge的资源时自动向外发送cookie
使用Firefox可以很容易的观察现有的cookie的?br />使用HTTPLook配合Firefox可以很容易的理解cookie的工作原理?/p>
IE也可以设|在接受cookie前询?/p>
q是一个询问接受cookie的对话框?/p>
session机制是一U服务器端的机制Q服务器使用一U类g散列表的l构Q也可能是使用散列表)来保存信息?/p>
另一U是作ؓ查询字符串附加在URL后面Q表现Ş式ؓhttp://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
q两U方式对于用h说是没有区别的,只是服务器在解析的时候处理的方式不同Q采用第一U方式也有利于把session id的信息和正常E序参数区分开来?br />Z在整个交互过E中始终保持状态,必d每个客户端可能请求的路径后面都包含这个session id?/p>
<form name="testform" action="/xxx">
<input type="text">
</form>
在被传递给客户端之前将被改写成
<form name="testform" action="/xxx">
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
<input type="text">
</form>
q种技术现在已较少应用Q笔者接触过的很古老的iPlanet6(SunONE应用服务器的前n)׃用了q种技术?br />实际上这U技术可以简单的用对action应用URL重写来代ѝ?/p>
HttpSession是Javaq_对session机制的实现规范,因ؓ它仅仅是个接口,具体到每个web应用服务器的提供商,除了对规范支持之外,仍然会有一些规范里没有规定的细微差异。这里我们以BEA的Weblogic Server8.1作ؓ例子来演C?/p>
Q在本小节中session的含义ؓ⑤和⑥的混合Q?/p>
1、session在何时被创徏
一个常见的误解是以为session在有客户端访问时p创徏Q然而事实是直到?server端程序调用HttpServletRequest.getSession(true)q样的语句时才被创徏Q注意如果JSP没有昄的?<%@page session="false"%> 关闭sessionQ则JSP文g在编译成Servlet时将会自动加上这样一条语句HttpSession session = HttpServletRequest.getSession(true);q也是JSP中隐含的session对象的来历?/p>
严格的讲Q做不到q一炏V可以做一点努力的办法是在所有的客户端页面里使用javascript代码window.oncolose来监视浏览器的关闭动作,然后向服务器发送一个请求来删除session。但是对于浏览器崩溃或者强行杀死进E这些非常规手段仍然无能为力?/p>
你可以创Llistenerȝ控session的创建和销毁事Ӟ使得在发生这L事g时你可以做一些相应的工作。注意是session的创建和销毁动作触发listenerQ而不是相反。类似的?HttpSession有关的listenerq有HttpSessionBindingListenerQ?HttpSessionActivationListener和HttpSessionAttributeListener?/p>
http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770
参见W三节对cookie的讨论,对session来说是只认id不认人,因此不同的浏览器Q不同的H口打开方式以及不同的cookie存储方式都会对这个问题的{案有媄响?/p>
q个问题与防止表单多ơ提交是cM的,可以通过讄客户端的令牌来解冟뀂就是在服务器每ơ生成一个不同的idq回l客LQ同时保存在session里,客户端提交表单时必须把这个id也返回服务器Q程序首先比较返回的id与保存在session里的值是否一_如果不一致则说明本次操作已经被提交过了。可以参看《J2EE核心模式》关于表C层模式的部分。需要注意的是对于用javascript window.open打开的窗口,一般不讄q个idQ或者用单独的idQ以防主H口无法操作Q徏议不要再window.open打开的窗口里做修Ҏ作,q样可以不用设|?/p>
做这个动作主要是Z在集环境中提示Weblogic Server session中的值发生了改变Q需要向其他服务器进E复制新的session倹{?/p>
常常有这L情况Q一个大目被分割成若干项目开发,Z能够互不q扰Q要求每个小目作ؓ一个单独的web应用E序开发,可是C最后突然发现某几个项目之间需要共享一些信息,或者想使用session来实现SSO (single sign on)Q在session中保存login的用户信息,最自然的要求是应用E序间能够访问彼此的session?/p>
<path>/NASApp</path>
</session-info>
在Tomcat中则没有q么方便的选择。在Tomcat版本3上,我们q可以有一些手D|׃nsession。对于版?以上?TomcatQ目前笔者尚未发现简单的办法。只能借助于第三方的力量,比如使用文g、数据库、JMS或者客LcookieQURL参数或者隐藏字D늭手段?/p>
context.setAttribute("appA", session);
contextA = context.getContext("/appA");
HttpSession sessionA = (HttpSession)contextA.getAttribute("appA");
session机制本nq不复杂Q然而其实现和配|上的灵zL却使得具体情况复杂多变。这也要求我们不能把仅仅某一ơ的l验或者某一个浏览器Q服务器的经验当作普遍适用的经验,而是始终需要具体情况具体分析?/p>
发布日期Q?一, 09 一?2006 12:49:53 GMT