最近在做一個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
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);
%>
補充:以上涉及cookie及session的了解,如有錯誤,請指正!