2012-03-20 62 views
1

我已經看過幾個很好的例子,如 How to Prevent Concurrent User Logins in PHP/MySQL Site? 他們描述了我試圖解決的問題。基本上只允許給定的用戶一次打開一個和一個會話,可以來自同一臺PC或2臺不同的PC。 因此,查詢數據庫的LoggedIN/Not LoggedIN標誌是最簡單可行的解決方案。 如何實現這是我的問題。
將會話驗證添加到每次請求頁面時運行的每個頁面都是不可行的,因爲它需要修改我們所有的JSP(長話短說,但我們沒有共同的頭文件) 有沒有什麼辦法可以重新配置Tomcat以對每個請求運行一些驗證檢查來查詢數據庫?也許使用閥門或其他方式?我沒有很多Tomcat的經驗,所以這就是我問的原因。 Thnx使用Tomcat來防止來自同一臺PC的併發用戶會話

回答

2

而不是更改所有的JSP文件,你可以看看使用Filter。該過濾器將允許您攔截請求並對請求執行某種級別的驗證。

然而,您決定檢查活動會話取決於您。

public class SessionCheckFilter implements Filter { 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
    throws IOException, ServletException { 

    //Your validation code here. 
    boolean returnValue = YourClass.performSessionValidation(); 
    if(returnValue){ 
     //Do Something 
    }else{ 
    //Do Something else 
    } 

    //standard filter call 
    chain.doFilter(req, res); 
} 

然後在web.xml中將servlet映射到您的代碼。

<filter> 
    <filter-name>SessionCheckFilter</filter-name> 
    <filter-class>com.stackoverflow.SessionCheckFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>SessionCheckFilter</filter-name> 
    <url-pattern>*.jsp</url-pattern> 
</filter-mapping> 

欲瞭解更多信息,請參見SO

+0

感謝您的回覆這裏servlet-filter信息頁面(根據您的需要改變)。我是否還需要ServletRequestListener來跟蹤會話何時創建並將其添加到地圖?過濾器能夠訪問我的SessionListener創建的地圖嗎?我希望在沒有需要訪問數據庫的情況下獲得解決方案。所以我一直在考慮使用Hashmap來存儲所有當前活動會話ID,這是否可能?使用靜態哈希表的 – MayoMan 2012-03-21 09:15:52

+0

可以跟蹤您的會話。但要非常小心。在會話閒置很長時間之後,您應該實施一些機制來清理哈希映射。否則,你會爲自己創建一個內存泄漏。 – Sean 2012-03-21 15:50:09

相關問題