2009-11-12 56 views
2

我需要知道何時tomcat接受使用領域認證的登錄給定的上下文。我一直在尋找可能的偵聽器(ServletContextListener和ServletContextAttributeListener),但不知道如何在登錄時發出通知。在使用多個上下文的tomcat單點登錄時,這也應該起作用。有任何想法嗎?收聽tomcat領域認證事件

回答

7

不幸的是,沒有標準/抽象的方式來使用Servlet API掛鉤它。您需要編寫特定於應用程序服務器的邏輯,或者實現一個全局過濾器,每次都會檢查HttpServletRequest#getUserPrincipal()。例如:

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) { 
    HttpServletRequest request = (HttpServletRequest) req; 
    Principal user = request.getUserPrincipal(); 
    HttpSession session = request.getSession(false); 

    if (user != null && (session == null || session.getAttribute("user") == null)) { 
     request.getSession().setAttribute("user", user); 

     // First-time login. You can do your intercepting thing here. 
    } 

    chain.doFilter(req, res); 
} 
+0

這看起來正是我所需要的。退出如何?也許看着會話到期事件? – rmarimon 2009-11-13 00:12:00

+0

如果'HttpSession#invalidate()'被用於註銷,那麼你確實可以鉤住'HttpSessionListener#sessionDestroyed()'並檢查'user'屬性是否存在。 – BalusC 2009-11-13 02:32:41

+0

我使用'httpRequest.getSession(false)'來防止浪費會話的創建。 – 2014-06-06 03:07:57