[轉]同一個tomcat不同項目的session共享問題


問題描述: 
session常常用來存儲一些公共信息供不同頁面訪問,比如用戶登錄信息。訪問同一個tomcat下的不同項目所創建的session是不一樣的。自然地面臨了如何共享session的問題。

解決思路: 
解決數據共享問題的思路無非兩種 
1、找個公共的地方存放共享的數據 
2、不同數據源之間做數據同步

解決方案: 
1、修改tomcat的server.xml文件 
每一個web應用程序都有唯一一個ServletContext實例對象,被該web應用下面的每一個servlet共享。通過修改tomcat的server.xml,使不同web應用的ServletContext可以互相訪問。然后,用ServletContext的setAttribute()方法把session存入ServletContext中,在另一個web程序就可以用getAttribute()方法取得傳遞過來的session。

server.xml文件修改如下:

 <Host name="localhost" appBase="webapps"unpackWARs="true" autoDeploy="true"> <Context path="/WebappA" debug="9" reloadable="true" crossContext="true"/> //WebappA為項目名,crossContext="true"是關鍵 <Context path="/WebappB" debug="9" reloadable="true" crossContext="true"/> </Host>

crossContext屬性的意思是:如果設置為true,你可以通過ServletContext.getContext() 調用另外一個WEB應用程序,獲得ServletContext 然后再調用其getAttribute() 得到你要的對象。

Java代碼如下:

WebappA:

HttpSession session = request.getSession(); session.setAttribute("userId", "test"); ServletContext ContextA =session .getServletContext(); ContextA.setAttribute("session", session );

 

WebappB:

HttpSession sessionB = request.getSession(); ServletContext ContextB = sessionB.getServletContext(); ServletContext ContextA= ContextB.getContext("/WebappA");// 這里面傳遞的是 WebappA的虛擬路徑 HttpSession sessionA =(HttpSession)ContextA.getAttribute("session"); System.out.println("userId: "+sessionA.getAttribute("userId"));

 

2、用數據庫存放session數據 
將session數據存入數據庫,不同web程序讀取數據庫數據即可。這樣做的好處是實現簡單,缺點是每次請求都要讀寫一次數據庫,加大了系統開銷。

3、用cookie代替session 
cookie是存放在本地硬盤上的文件,適合用於存放小量數據,且可以通過cookie.setPath(“/”)方法設置cookie為同一tomcat下的所有webapp共享。cookie.setPath(“/”)方法的參數”/”表示tomcat的webapps文件夾下的所有應用共享該cookie。

java代碼 
寫cookie:

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//設置日期格式 Cookie cookie = new Cookie("loginTime",df.format(new Date())); cookie.setPath("/"); //Tomcat的webapps目錄下共享 context.getHttpResponse().addCookie(cookie);

 

讀cookie:

Cookie[] cookies = context.getHttpRequest().getCookies(); for(Cookie c :cookies ){ if(c.getName().equals("loginTime")){ System.out.println("loginTime: " + c.getValue()); } }

(原文地址:http://blog.csdn.net/jayyanzi/article/details/46561509)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM