(精)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);
%>