方法一:
首先要明白:session是在服務器端創建並保存在服務器端,當代碼中創建session時會相應地創建sessionID保存在服務器端,同時服務器向瀏覽器響應信息時會以cookie形式 (其實就是“JSESSION:sessionID”的鍵值對)返回並保存到瀏覽器本地中。一旦當前瀏覽器的進程要取服務器對應的保存在session的信息時候,就會取出剛纔保存在cookie中對應的sessionID和服務器端的sessionID進行對比,相同就能取出你想要的信息,不能就不能取出。
好了,明白這一點後,我們就可以即使瀏覽器禁止了cookie也能用session。因爲在一般情況下(即沒禁時候),我們不需把sessionID保存到cookie中,因爲一般情況下瀏覽器會自動的;然而當禁止時候,就需要我們主動的把sessionID寫入到cookie中。那麼問題就解決了。
主動把sessionID寫到cookie中
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//先用一次Session,就會自動創建Session的id
HttpSession session=request.getSession();
session.setAttribute("mess","你關閉了瀏覽器我還是給你看到session");
//自己把SessionID保存在cookie中
Cookie cookie=new Cookie("JSESSIONID", session.getId());
//設置cookie保存時間
cookie.setMaxAge(60*20);
//被創建的cookie返回瀏覽器
response.addCookie(cookie);
out.println("添加Session成功!");
}
直接取就可以了:
String mess=(String)request.getSession().getAttribute("mess");
out.println(mess);
方法二:
不用保存SessionID到cookie中,而是動態地把當前用戶的SessionID添加到程序的各超鏈接或轉發地址中,那麼就可以確保用戶的唯一。response.encodeRedirectURL(url)是一個進行URL重寫的方法, 使用這個方法的作用是爲了在原來的url後面追加上Jsessionid 。 目的是保證即使在客戶端瀏覽器禁止了cookie的情況下,服務器端仍然能夠對其進行事務跟蹤。
例如這樣:
功能:物品加入購物車後,點擊返回主頁面,主頁面顯示剛纔加入到購物車的物品,當然了,這裏是考慮瀏覽器禁止cookie情況下。
//動態改寫URL
String url = response.encodeRedirectURL("/UserManager/BuyBookCL");
PrintWriter.println("<a href='"+url+"'>加入購物車</a>");
//在返回時也要加入 URL地址重寫
String url = response.encodeRedirectURL("/UserManager/home");
PrintWriter.println("<a href='"+url+"'>返回主頁面</a><br/>");