2011-07-15 110 views
2

我在tomcat中使用java servlet。 我保存在散列表中的用戶名和httpsession屬性usrname 我想知道是否有方法知道httpsession是否有效。java httpsession有效嗎?

我想:

try{ 
    String user = httpSession.getAttribute("username") 
    return "is valid"; 
}catch(IllegalStateException e){ 
    return "is not valid"; 
} 

TNKS的答案,但我怎麼能如果我不慣於一個「登錄」的用戶從更多的一處連接呢?如果我僅在創建新會話的時候控制,我無法知道他是否連接到另一個會話。

回答

1

而不是檢查保存的會話是否有效,您應該查看servlet上的HttpServletRequest,然後檢查isRequestedSessionIdValid()。在servlet中工作時,您始終可以從請求中獲取Session,而不是將其保存到散列表中。

+0

這實際上並沒有什麼幫助,因爲您仍然需要處理(或接受)出現非法StatException的可能性。因爲在檢查和會話獲取之間的微秒內,會話可能失效。 – MJB

+0

我的(也許是不正確的)假設是tomcat在傳遞servlet請求之前看到會話ID,它會檢查它是否超時,如果不重置時間以保持會話存活無論默認會話長度是多少。沒有? –

+1

但是你可以同時有一個註銷請求。多線程,多servlet,還記得嗎? – MJB

9

無需將httpSession存儲在您自己的散列中。

看看HttpServletRequest的api。如果您查看getSession(Boolean x)(傳遞false以便它不創建新會話)將確定會話是否有效。下面是一個例子

public void doGet(HttpServletRequest req, HttpServletResponse res){ 
    HttpSession session = req.getSession(false); 
    if(session == null){ 
     //valid session doesn't exist 
     //do something like send the user to a login screen 
    } 
    if(session.getAttribute("username") == null){ 
     //no username in session 
     //user probably hasn't logged in properly 
    } 

    //now lets pretend to log the user out for good measure 
    session.invalidate(); 
} 

在一個側面說明,如果我正確讀取你的問題,你是存儲在自己的地圖信息,你必須要小心,你不創建一個內存泄漏和被清除自己輸入哈希表中的條目。

1

我同意肖恩。我補充一點,對於這種類型的檢查的良好做法是使用過濾

看到這裏Servlet Filter

只要看看肖恩寫的代碼,並把它放在一個過濾器來代替。定義你在web.xml中進行過濾,並且每次有請求進入時,過濾器都會執行。

這樣你可以驗證用戶是否是auth。而不會混淆你的servlet代碼。

+0

是的,過濾器將工作。我想在我的例子中展示基礎知識。 只有一個servlet,可以在servlet中執行此檢查,但在開始管理多個servlet時會變得非常混亂。在這種情況下移動到過濾器更好 – Sean

+0

你是對的,你的迴應非常好..只是想添加我的2美分 – Cygnusx1