2009年3月18日星期三

WLS_056:同一个ear中不同的Web应用如何共享Session?

本文最后一次修改时间:2012-02-23。
开发环境:WebLogic Server 12c开发版。

Web规范中规定每个Web应用的Session信息彼此是不能共享的,但是在开发Web应用时,有时我们希望多个Web应用之间可以共享Session信息。
WebLogic 允许同一个ear中的多个Web应用共享Session信息。注意,这是WebLogic自己的特性,不是规范中的。

下面我们以shoppingcart.war为例,来说明如何实现。

1. 把shoppingcart.war复制两份,分别命名为shoppingcart1.war和shoppingcart2.war

2. 把shoppingcart1.war和shoppingcart2.war打到一个ear中:shoppingcart.ear
修改ear包中的META-INF下的application.xml内容如下:
<?xml version='1.0' encoding='utf-8'?>
<application xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.4">
  <display-name></display-name>
  <module>
    <web>
      <web-uri>shoppingcart1.war</web-uri>
      <context-root>shoppingcart1</context-root>
    </web>
  </module>
  <module>
    <web>
      <web-uri>shoppingcart2.war</web-uri>
      <context-root>shoppingcart2</context-root>
    </web>
  </module>
</application>

将ear包中的META-INF下的weblogic-application.xml内容置空:
因为我们首先要确定默认配置下,应用可以正常访问,然后再增加共享Session配置。
<?xml version='1.0' encoding='utf-8'?>
<weblogic-application xmlns="http://www.bea.com/ns/weblogic/90" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
</weblogic-application>


3. 部署并访问应用shoppingcart1和shoppingcart2
(1)http://localhost:7001/shoppingcart1/访问正常,购买12支黑色钢笔放入Session中。

(2)http://localhost:7001/shoppingcart2/访问正常,购买12支蓝色钢笔放入Session中。

可以看出,shoppingcart1和shoppingcart2各自访问正常,但Session信息没有共享。

4. 修改weblogic-application.xml,并重新部署
修改ear包中的META-INF下的weblogic-application.xml内容如下:
<?xml version='1.0' encoding='utf-8'?>
<weblogic-application xmlns="http://www.bea.com/ns/weblogic/90" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <session-descriptor> 
    <persistent-store-type>memory</persistent-store-type> 
    <sharing-enabled>true</sharing-enabled> 
  </session-descriptor> 
</weblogic-application>

访问http://localhost:7001/shoppingcart1/或http://localhost:7001/shoppingcart2/,
抛出如下异常:
java.lang.ClassCastException: com.servlets.shoppingCartItem cannot be cast to com.servlets.shoppingCartItem
这是为什么呢?
原来是因为一个ear中有两个war包,但是由不同的ClassLoader分别装载,war包中的类在各自Classloader中。
也就是说,虽然在本实验中两个war包中有一摸一样的类,但是JVM会认为它们是不一样的类,因此会报出上面的错误。

5. 把两个war包中相同的类拿出来,打成jar包,放到[domain_name]\lib目录下,再重新部署ear包。
(1)把shoppingcart1.war和shoppingcart2.war包中相同的类解压出来,打成jar包:shoppingcart.jar。
(2)删除shoppingcart1.war和shoppingcart2.war包中相同的类,重新打成ear包。
(3)把shoppingcart.jar复制到[domain_name]\lib目录下。
(4)重新启动WebLogic Server,重新部署shoppingcart.ear。

6. 重新访问应用shoppingcart1和shoppingcart2。
(1)访问http://localhost:7001/shoppingcart1/,添加一些商品。
(2)访问http://localhost:7001/shoppingcart2/,添加另一些商品。
(3)分别在shoppingcart1和shoppingcart2查看Session中的信息,发现显示了所有的商品信息。


这说明同一个ear中不同的Web应用共享Session信息配置成功。

Project 下载:shoppingcart(2WarSessionShare).7z

参考文献:
1. http://hi.baidu.com/listlofusage/blog/item/d7568f31ac7d00ac5edf0ef1.html
2. https://forums.oracle.com/forums/thread.jspa?threadID=1010819
3. http://objectmix.com/weblogic/528128-sharing-session-across-web-applications-wl8-1-a.html
4. http://alexsunny.iteye.com/blog/41836
5. http://blog.csdn.net/yousuf007/article/details/5252604
6. http://bbs.middleware123.com/thread-705-1-1.html
7. http://www.renren.it/a/fuwuqiruanjian/Jboss/20100926/24584.html
8. http://www.iteye.com/topic/1117133

没有评论: