問題描述:
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)