|
对于这样一种结构,在session机制本身上来解决session共享的问题应该是不可能的了。除了借助于第三方的力量,比如使用文件、数据库、JMS或者客户端cookie,URL参数或者隐藏字段等手段,还有一种较为方便的做法,就是把一个应用程序的session放到ServletContext中,这样另外一个应用程序就可以从ServletContext中取得前一个应用程序的引用。示例代码如下,
应用程序A
context.setAttribute("appA", session);
应用程序B
contextA = context.getContext("/appA"); HttpSession sessionA = (HttpSession)contextA.getAttribute("appA");
值得注意的是这种用法不可移植,因为根据ServletContext的JavaDoc,应用服务器可以处于安全的原因对于context.getContext("/appA");返回空值,以上做法在Weblogic Server 8.1中通过。
那么Weblogic Server为什么要把所有的应用程序的cookie路径都设为/呢?原来是为了SSO,凡是共享这个session的应用程序都可以共享认证的信息。一个简单的实验就可以证明这一点,修改首先登录的那个应用程序的描述符weblogic.xml,把cookie路径修改为/appA访问另外一个应用程序会重新要求登录,即使是反过来,先访问cookie路径为/的应用程序,再访问修改过路径的这个,虽然不再提示登录,但是登录的用户信息也会丢失。注意做这个实验时认证方式应该使用FORM,因为浏览器和web服务器对basic认证方式有其他的处理方式,第二次请求的认证不是通过session来实现的。具体请参看[7] secion 14.8 Authorization,你可以修改所附的示例程序来做这些试验。
八、总结
session机制本身并不复杂,然而其实现和配置上的灵活性却使得具体情况复杂多变。这也要求我们不能把仅仅某一次的经验或者某一个浏览器,服务器的经验当作普遍适用的经验,而是始终需要具体情况具体分析。
关于作者:
郎云鹏(dev2dev ID: hippiewolf),软件工程师,从事J2EE开发 电子邮件:langyunpeng@yahoo.com.cn 地址:大连软件园路31号科技大厦A座大连博涵咨询服务有限公司
参考文档:
[1] Preliminary Specification http://wp.netscape.com/newsref/std/cookie_spec.html [2] RFC2109 http://www.rfc-editor.org/rfc/rfc2109.txt [3] RFC2965 http://www.rfc-editor.org/rfc/rfc2965.txt [4] The Unofficial Cookie FAQ http://www.cookiecentral.com/faq/ [5] http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036869 [6] http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770 [7] RFC2616 http://www.rfc-editor.org/rfc/rfc2616.txt
代码下载:sampleApp.zip
(出处:清风学院)
上一篇:日前和时间的操作
下一篇:初学jsp写的一个显示系统目录文件的小程序
|