2012-02-06 79 views
4

我有一個非常基本的問題,如何創建HTTPSession的作品。我知道你們夥計們會看到這個問題,因爲類似的問題 類似的問題存在。但有理由爲什麼我問這個問題這裏是: -當請求來自web服務器而不是web瀏覽器時,HTTPSession的創建如何工作?

我知道httpsession是網絡瀏覽器所獨有的,服務器在我們首次執行HttpServletRequest.getSession時創建它。它將保持相同的會話,直到我們關閉瀏覽器 。但我有一點點不同的情況。我有一個Web應用程序在一個Tomcat實例上說T1.On這個Web應用程序的歡迎頁面 我已經提供了兩個鏈接,點擊它可以把我帶到不同web應用程序的相同java servlet(S1)託管在另一個Tomcat實例T2上(這兩個鏈接 打開兩個單獨的彈出窗口)。現在,我先點擊link1並檢查S1中的sessionId,然後查找它的值爲1678.現在,我先點擊link2和 檢查S1中的sessionId,然後再次查找它的值爲1678. 我的問題是爲什麼我得到來自link1和link2的請求都來自 的請求的同一會話ID?我可以做些什麼來獲得這兩個請求的不同會話?

尋找淨可能的解決方案後,我試了一下: -在LINK1的點擊,在Servlet的S1,我複製會話屬性,使它無效並創建新的一個。 說新的會話ID是8765。現在我點擊link2,並在這個請求中找到了同樣的會話。所以我進一步無效並創建新的(例如 新的會話ID是4897)。理想情況下,它應該過期第一個瀏覽器會話(點擊link1生成)。要驗證它,我點擊彈出的任何地方1它沒有得到 已過期,但我再次看到最後生成的會話ID,即4897.我不明白爲什麼它附加相同的會話ID與兩個彈出窗口?

人們感謝您耐心等待您的時間,並閱讀這個長長的場景?

編輯: -

 Cookie[] cookies = req.getCookies(); 
     if(cookies!=null) 
     for (int i = 0; i < cookies.length; i++) { 
     cookies[i].setMaxAge(0); 
     context.getResponse().getHttpServletResponse().addCookie(cookies[i]); 
     } 

    HttpSession myAppSession = req.getSession();//line 1 

假設在鏈路1的點擊,我得到的會話ID爲1234,再經過2鏈接點擊一下也是我得到相同的會話ID。根據我的理解,在執行第1行以上的代碼之後,我應該得到不同的會話ID,因爲我在獲取會話之前將MaxAge設置爲0。但它沒有發生?

回答

7

我認爲這是你在找什麼

默認情況下會話跟蹤發生的餅乾WebServer以Cookie的形式將會話ID發送到瀏覽器。並且,瀏覽器發送具有用於隨後的請求的會話ID的cookie。

如何在瀏覽器識別爲一個鏈接/發送請求其餅乾? 它基於這些參數。如果要求這些paramters相匹配的瀏覽器發送特定的Cookie

  1. 域:到該請求由域名。驗證你的情況如果域名爲兩個實例
  2. 路徑是一樣的:如果路徑名是一樣的。 Web Server發送上下文根作爲路徑,請求在同一個上下文根下共享cookie。
  3. 安全:如果給定的cookie是安全的或不服務器發送。意思是,如果cookie可以在非安全通道上發送。

這些參數可以讓瀏覽器餅乾發送到服務器。 而且因爲你有兩個實例發送相同的cookie。我認爲會話ID正在共享

如果請求化子性質如請求URI,域名和路徑(即,上下文根)是請求之間相同,沒有辦法告訴瀏覽器使用不同的餅乾。

您有以下一些選項:

  1. 使用不同的域名。
  2. 使用不同的上下文根。
  3. 有一個LB在兩個節點前,重定向到基於會話ID
+0

拉梅什感謝回覆正確的節點。在考慮了cookie事實之後,重構了代碼,但它仍然返回相同的會話ID。在原文中查看我的編輯部分 – 2012-02-06 10:18:50

+0

你能告訴兩個服務器的域名是什麼嗎? – 2012-02-06 10:23:04

+0

你應該嘗試訪問不同的域名。 – 2012-02-06 10:26:08

相關問題