2013-08-07 26 views
0

我有一個頁面可以訪問具有alpha權限的帳戶。 JSP會檢查會話中是否存在名爲"AlphaPerm"的屬性。如何遠程無效用戶的servlet會話?

但我一直在努力的問題是,如果我發現用戶正在搞亂/濫用alpha測試權限,我想立即阻止他。我可以立即在數據庫中更改他的權限,但這並不能立即阻止施虐者。

一個可能的解決方案是檢查我的數據庫,每次我的用戶做什麼,但我不想這樣做,因爲這會減慢數據庫。

那麼,我該如何殺死他的會話(創建管理頁面是我的計劃,但我如何獲得用戶會話對象)?基本上我想做一個管理頁面,所以我可以禁止用戶。

+0

如果用戶是'你怎麼檢查與alpha權限混合? –

+0

@DigvijayYadav以防萬一我的alpha測試人員變得瘋狂...... –

+0

等等,你可能會錯過理解我的問題。我想使他的會話無效。這就是我想要做的,也許是一個管理頁面。 –

回答

2

您可以通過執行HttpSessionListener來保持對用戶會話的引用。 This example顯示如何實現會話計數器,但您也可以通過將其存儲在上下文作用域集合中來保留對各個會話的引用。然後,您可以從管理頁面訪問會話,檢查其屬性並使其中的一些無效。 This post也可能有用的信息。

編輯:下面是一個簡單的實現(未測試):

public class MySessionListener implements HttpSessionListener { 

    static public Map<String, HttpSession> getSessionMap(ServletContext appContext) { 
     Map<String, HttpSession> sessionMap = (Map<String, HttpSession>) appContext.getAttribute("globalSessionMap"); 
     if (sessionMap == null) { 
      sessionMap = new ConcurrentHashMap<String, HttpSession>(); 
      appContext.setAttribute("globalSessionMap", sessionMap); 
     } 
     return sessionMap; 
    } 

    @Override 
    public void sessionCreated(HttpSessionEvent event) { 
     Map<String, HttpSession> sessionMap = getSessionMap(event.getSession().getServletContext()); 
     sessionMap.put(event.getSession().getId(), event.getSession()); 
    } 

    @Override 
    public void sessionDestroyed(HttpSessionEvent event) { 
     Map<String, HttpSession> sessionMap = getSessionMap(event.getSession().getServletContext()); 
     sessionMap.remove(event.getSession().getId()); 
    } 
} 

然後,您可以從任何servlet訪問會話圖:

Collection<HttpSession> sessions = MySessionListener.getSessionMap(getServletContext()).values(); 
+0

這很有趣,似乎是以正確的方式進行的,但我有點笨,我不太明白他們是如何做到的。我希望得到這樣的東西:tomcatServletStuff。getSessionByID(somGuyzID),並且此方法將返回一個Session對象 –

+0

編輯我的答案以包含示例實現。 –

+0

任何想法爲什麼我的想象方法不存在? –

0

據我所知你的問題檢查DB絕對是一件壞事。

此外,您必須將某些值與某些其他標準值進行比較,以確定用戶是否在搞亂。 因此,數據庫檢查的替代方法可以將這些值存儲在用戶會話中並檢查這些值。

此外,而不是創建一個管理頁面(可能是一個JSP頁面),我會建議使用ServletFilter做這項工作。

另外,我個人建議的一個事情是,不要使整個會話無效,而是應該對用戶進行一些限制,直到下一次登錄(例如限制某些資源的訪問)。

+0

那麼,我該如何阻止他呢? –

+0

因此,例如使用過濾器,您可以檢查用戶是否受到限制。如果是,那麼你可以將他/她的請求(對於他正在搞亂的頁面)轉發給一些錯誤頁面,告訴他他/她做錯了什麼以及爲什麼他被限制。 –

+0

過濾器是否需要檢查我的數據庫?我不確定過濾器是如何工作的 –