2013-08-16 73 views
4

會話無效後,纔可能通過request.getSession()不進行新的請求,通過請求對象得到新的會話?invalidate()之後,是否有可能從請求對象中獲得新的會話?

我的請求對象流量第1頁至第2頁和第2頁,第1頁第1再次向頁第2頁,並再次同第2頁至第2頁....請求頁面不能改變,但每次都要求第1頁到第2頁,我們需要獲取詳細會話和無效並重新創建它.. 這樣

HttpSession session = request.getsession(false) 
String user = (String)session.getAttribute("name"); 
session.invalidate(); 
session=request.getSession(true); 
RequestDispacher dis = request.requestDispatcher("path"); 
dis.forword(request,respone); 

,但它給空會話或細節這不是第二次 工作

也嘗試在即將到來的cookies中設置會話ID 這樣的

Cookie[] c = request.getCookies(); 
      for(Cookie k: c){ 
       if(k.getName().equalsIgnoreCase("JSESSIONID")){ 
        System.out.println("k.getValue() : "+k.getValue()); 
        System.out.println("httpSession.getId() : "+httpSession.getId()); 
        k.setValue(httpSession.getId()); 
       } 
      } 
+0

如果你需要它,你爲什麼會使會話無效? –

+0

用於安全目的 – Mask5323

回答

2

AS-按照Javadocs,只需調用request.getSession()

返回與此請求相關的當前的HttpSession,或者如果沒有當前會話和創建是真實的,返回一個新的會話。

如果製作的是虛假的,該請求沒有有效的HttpSession,這 方法返回null。

爲了確保會話正確維護,響應被提交之前,則必須調用此方法 。如果容器使用 cookie維護會話的完整性,並詢問何時響應致力於創建一個新的會話 ,一個IllegalStateException是 拋出。

所以調用getSession方法將創建您一個新的會話:

final HttpSession session = request.getSession() 

下面是一個例子JSP,證明代碼工作:

test.jsp的

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>Session invalidation test</title> 
</head> 
<body> 
<% 

// Uses implicit session for JSP 

out.println("Session is " + session); 
session.invalidate(); 
out.println("\nNew session is " + request.getSession()); 

request.getRequestDispatcher("/test2.jsp").forward(request, response); 

%> 
</body> 
</html> 

test2。JSP

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>Session invalidation test</title> 
</head> 
<body> 
<% 

out.println("Session is " + request.getSession()); 

%> 
<h1>Test 2</h1> 
</body> 
</html> 

當上的Tomcat6執行,在瀏覽器中的輸出是:

Session is [email protected] 
Test 2 

這表明test.jsp被exectued併成功轉發到test2.jsp。

+0

您也可以使用'request.getSession()'而不使用布爾參數。 – BalusC

+0

在JSP上測試並更新;謝謝。 –

+0

我同意你的答案,但我的問題是在這之後 out.println(「Session is」+ session); session.invalidate(); out.println(「New session is」+ request.getSession()); 和呼叫請求調度和前頁到另一條路徑 和呼叫會話 request.getSession 所以ican'd得到它 它給空 但我需要在我的項目 用於維持會話,也sequire我的會議沒有一個赫克它 – Mask5323

0

invalidate()

後,你應該寫

req.getSession(true)

然後getSession()方法將檢查是否已經是一個會話存在與否。如果session是現有的,它會return該會話對象,否則一個新的會話創建並返回到客戶端。

否則,如果你試圖做類似

session.inValidate(); 
session..trySomething() //leads to exception "Session already invalidated." 
+0

我試試這個,但是下次我們在同一個請求對象上獲得會話對象時,它給出null .... – Mask5323

+0

+1用於解釋如何通過嘗試在無效會話上調用方法拋出異常。謝謝。 – medokr

相關問題