WLS_056:同一個ear中不一樣的Web應用如何共享Session?

Web規範中規定每一個Web應用的Session信息彼此是不能共享的,可是在開發Web應用時,有時咱們但願多個Web應用之間能夠共享Session信息。

WebLogic 容許同一個ear中的多個Web應用共享Session信息。注意,這是WebLogic本身的特性,不是規範中的。 html

下面咱們以shoppingcart.war爲例,來講明如何實現。

1. 把shoppingcart.war複製兩份,分別命名爲shoppingcart1.war和shoppingcart2.war

2. 把shoppingcart1.war和shoppingcart2.war打到一個ear中:shoppingcart.ear
修改ear包中的META-INF下的application.xml內容以下:
java

<?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中。 web


能夠看出,shoppingcart1和shoppingcart2各自訪問正常,但Session信息沒有共享。 session

4. 修改weblogic-application.xml,並從新部署
修改ear包中的META-INF下的weblogic-application.xml內容以下:
oracle

<?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信息配置成功。 app

Project 下載:shoppingcart(2WarSessionShare).7z 
dom

參考文獻:
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
jsp

相關文章
相關標籤/搜索