1. 程式人生 > >(精)tomcat 二級域名 session共享

(精)tomcat 二級域名 session共享

最近在做一個jsp的網站遇到了session共享的問題,下面以一個簡單的例項講解一下其中的細節及解決方法:

網站有兩個域名:主域名www.test.com  二級域名xxx.test.com

1、用主域名開啟網站,比如訪問www.test.com/login.jsp,這時會產生一個session,並將JSESSIONID=XXXXXXXXXX儲存到客戶端Cookie中;

2、接著進行登陸操作,提交表單到www.test.com/checklogin.jsp,  這兩次操作是在同一會話(session)下(假設沒關瀏覽器),why?

     因為我們再通過主域訪問站點的其他頁面時,第一步在客戶端生成的JSESSIONID(通過cookie方式,如果cookie被禁了則通過url)會提交到服務端

     用於獲取對應的session物件,兩次JSESSIONID一樣,所以兩次的會話保持一致

3、登陸成功後去到了www.test.com/index.jsp 頁面,頁面列印當前的JSESSIONID=XXXXXXXXXX

4、接著通過二級域名訪問index.jsp,即xxx.test.com/index.jsp,這時頁面列印的JSESSIONID=YYYYYYYYYY,也就是說再通過二級域名訪問index.jsp

    這個頁面時session已經改變了,即剛才的登陸對二級域名下的訪問無效了,why?因為通過該二級域名訪問index.jsp時,由於無法獲取到主域名生成的JSESSIONID

    所以會重新生成一個session,並把JSESSIONID=YYYYYYYYYY儲存到客戶端。

如何解決?

我的解決方法:做一個跳轉頁面skip.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%

 String JSESSIONID = request.getSession().getId();//獲取當前JSESSIONID (不管是從主域還是二級域訪問產生)

 Cookie cookie = new Cookie("JSESSIONID", JSESSIONID);
 cookie.setDomain(".test.com"); //關鍵在這裡,將cookie設成主域名訪問,確保不同域之間都能獲取到該cookie的值,從而確保session統一
 response.addCookie(cookie);  //將cookie返回到客戶端

 request.getRequestDispatcher("indes.jsp").forward(request, response);

%>