1. 程式人生 > >不同使用者之間session內容互相沖突

不同使用者之間session內容互相沖突

現象是:  
  A使用者在1.jsp頁面中訪問資料庫,返回的是一個物件,用下面這種辦法:  
  session.setAttribute("obj",myobj);  
  把這個物件放到session中。然後在2.jsp中用  
  MyObjects   obj=(MyObjects)session.getAttribute("obj");  
  方法得到這個物件,再從中取值。  
   
  B使用者也作同樣的操作。  
   
  如果A先,B後,那麼A之前放到session中的obj就會被B的obj替換掉。

解決方法:

首先你的儲存個人資訊的類的屬性不可以設定為static,  
  檢查是否存在這個問題,如果這裡沒有問題。  
   
  那麼因為你自己寫的類是執行緒不安全的,你如果在這個類中對session進行操作,當  
  多個使用者同時訪問是,可能出現上邊的問題。  
  解決辦法,在你的類之前,加上   synchronized   關鍵字,進行同步。確保一次只有一個使用者執行裡邊的方法。當然,也可以只對某幾個方法加上這個關鍵字。  

會話管理一般是由servlet引擎所提供的,用來跟蹤所有的客戶端-伺服器連線,為每一個連線分配唯一的Id,在建立連線時分配給客戶端,並被傳送給後續響應中的客戶端.(使用ctrl+N新開啟的視窗仍然屬於後續連線)
    會話管理不僅僅是識別連線,每個會話是一個java物件(HttpSession類),所以通過ip來識別說法是不對的.
    將sessionId分配給客戶端,不同的伺服器有不同的方法,常見的技術有如下三種:
    1 ) URL重寫
    session id的名稱-值新增到URL(名稱必須是jsessionid)
    2 ) 通過cookie
    cookie的名稱必須是JSESSIONID,需要瀏覽器支援cookie
    3 ) 加密套接字協議層(SSL)
    Http協議的SSL已經建立在會話管理中

使用不同的新開視窗分別登入是不同的連線,session也是不一樣的.

我們寫一個測試頁面來檢驗一下sessionId的值和cookie中的值:
頁面的程式碼如下(testSession.jsp):







<1>在weblogic中測試

開啟一開視窗,頁面顯示為:
Cookie in the request:
JSESSIONID : BFbXpjlEhXOdHjJbmNal8NwPniBA4UUH2Yu0SWAeW69iQEfqCyYn!-2110814544

Request session Id : BFbXpjlEhXOdHjJbmNal8NwPniBA4UUH2Yu0SWAeW69iQEfqCyYn!-2110814544!1095064343206

使用ctrl+N開啟一個新視窗的頁面顯示為:
Cookie in the request:
JSESSIONID : BFbXpjlEhXOdHjJbmNal8NwPniBA4UUH2Yu0SWAeW69iQEfqCyYn!-2110814544

Request session Id : BFbXpjlEhXOdHjJbmNal8NwPniBA4UUH2Yu0SWAeW69iQEfqCyYn!-2110814544!1095064343206

重新開一個視窗,頁面顯示為:
Cookie in the request:
JSESSIONID : BFbyitXTY2Kt72b2vn2uvrzHsGjt98larvxKSz4fcZngOsIVsGSI!-2110814544

Request session Id : BFbyitXTY2Kt72b2vn2uvrzHsGjt98larvxKSz4fcZngOsIVsGSI!-2110814544!1095064562753

我們可以看到對於每個新開啟的視窗其session是不一樣的


<2>在oracle IAS中測試

新開視窗,頁面顯示為:
Cookie in the request:
JSESSIONID : c3df128b9f7c4a60a75a88c3cb3cb5e2.s6Tv-h0Ka3CNa30McybtahqM-x4R-xyK-x4Sa2SPmxqTc3mInAeMbN8QmN0Sc2SHc30Ka2bMn69Rnk8IrRrR-B9ymwTxpQOxbhqOax4R8R9ymBrzmwbMn69Rnk8xn6jAmljGr5XDqQLvpAe_

Request session Id : c3df128b9f7c4a60a75a88c3cb3cb5e2

使用ctrl+N開啟新視窗的頁面顯示為:
Cookie in the request:
JSESSIONID : c3df128b9f7c4a60a75a88c3cb3cb5e2.s6Tv-h0Ka3CNa30McybtahqM-x4R-xyK-x4Sa2SPmxqTc3mInAeMbN8QmN0Sc2SHc30Ka2bMn69Rnk8IrRrR-B9ymwTxpQOxbhqOax4R8R9ymBrzmwbMn69Rnk8xn6jAmljGr5XDqQLvpAe_

Request session Id : c3df128b9f7c4a60a75a88c3cb3cb5e2

重新開一個視窗,頁面顯示為:
Cookie in the request:
JSESSIONID : 556dca64e085417bad8f9d88be0401ee.s6Tv-h0Ka3CNa30McybtahqM-x4R-xyK-x4Sa2SPmxqTc3mInAeMbN8QmN0Sc2SHc30Ka2bMn69Rnk8IrRrR-B9ymwTxpQOxbhqOax4R8R9ymBrzmwbMn69Rnk8xn6jAmljGr5XDqQLvpAe_

Request session Id : 556dca64e085417bad8f9d88be0401ee

同樣我們可以看到每個新開視窗其session是不一樣的