|
3#
楼主 |
发表于 2018-3-2 17:15:08
|
只看该作者
需要注意的是,操作共享的session应该遵循一些编程约定,比如在session attribute名字的前面
加上应用程式的前缀,使得setAttribute(“name”, “neo”)变成setAttribute(“app1.name”, “neo”),以
防止命名空间冲突,导致互相覆盖。
在Tomcat中则没有这么方便的选择。在Tomcat版本3上,我们还能有一些手段来共享session
。对于版本4以上的Tomcat,只能借助于第三方的力量,比如使用文件、数据库、JMS或客户端co
okie,URL参数或隐藏字段等手段。
对于这样一种结构,在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机制本身并不复杂,然而其实现和设置上的灵活性却使得具体情况复杂多变。这也需求
我们不能把仅仅某一次的经验或某一个浏览器,服务器的经验当作普遍适用的经验,而是始终需要
具体情况具体分析。 |
|