2010-03-22 56 views

回答

0

恕我直言,你不應該試圖攔截容器的認證系統;在你的情況下,重定向URL可以在web.xml中聲明設置。

如果你想執行一些認證後的動作,我建議設置一個虛擬的post-auth servlet/jsp,它可以做你想做的事,然後重定向到請求的資源。然後可以將post-auth servlet正確配置爲登錄後頁面。

+0

嗨奧利弗, 據我所知,我們不能設置在web.xml重定向URL。我有不同的角色。例如。管理員和一般。您是否可以在登錄web.xml中的這兩個角色後爲相同的登錄頁面設置成功url?因此,如果管理員登錄,他應該重定向到/Admin/home.jsp,並且對於常規,它應該是/General/home.jsp等。在我看來,這根本不可能。這就是爲什麼我試圖在j_security_check上保留一個過濾器。不過,如果我錯過了一些東西,請告訴我。 – TCM 2010-03-22 15:54:35

1

您不能編程掛鉤/j_security_check。這是一個安全限制。

您最好的辦法是通過手動檢查HttpSession中的用戶主體來確定首次登錄,並在缺席時將其放在那裏,然後執行您的操作。我在here之前發佈了類似的答案。以下是過濾器代碼的摘錄,您只需將過濾器映射到所需的覆蓋受保護頁面的url-pattern即可。

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { 
    HttpServletRequest httpRequest = (HttpServletRequest) request; 
    UserPrincipal user = httpRequest.getUserPrincipal(); 
    HttpSession session = httpRequest.getSession(); 
    if (user != null && session.getAttribute("user") == null) { 
     session.setAttribute("user", user); 

     // First-time login. You can do your intercepting thing here. 
    } 
    chain.doFilter(request, response); 
} 
+0

Hi BalusC, 其實我想根據他/她的角色將用戶重定向到合適的位置。這就是爲什麼我想保留一個過濾器,以查看j_security_check在會話/請求URL重定向中設置了所有變量。我終於找到了答案。這是一種補丁工作,但它更重要的工作:) 請參閱此鏈接,請評論你對我的方法有什麼看法: - http://stackoverflow.com/questions/2478770/servlet-security-question-about- j-security-check-j-username-and-j-password/2493525#2493525 – TCM 2010-03-22 15:57:24

+0

你可以在過濾器中完成它。將'response'返回到'HttpServletResponse'並調用'sendRedirect()'。 Scriptlets是不好的做法。 – BalusC 2010-03-22 16:03:18

+0

雅肯定!我會考慮到這一點。除了過濾之外,我還可以保留一個簡單的servlet。 Anywys,重要的是現在我可以休息。我從字面上搜索了谷歌上的每一個鏈接,看看我是否可以在這裏和那裏設置一些屬性,它應該開始工作。但遺憾的是我沒有找到任何這樣的鏈接。然後,我張貼在stackoverflow上,在這裏我也沒有迴應。所以,我非常失望,那麼今天我開始關注Spring的安全性,看看它能提供什麼,但最後這個想法給我留下了深刻印象,現在我可以休息並讓容器處理所有事情。 – TCM 2010-03-22 16:08:52

0

一種便攜式解決方案。

  1. 在模式/ *上註冊全局過濾器;嘗試從會話(即用戶工作區)獲取自定義對象;在doFilter()中嘗試從會話(即用戶工作區)獲取自定義對象。

  2. 如果object爲null,則將新對象放入會話並執行登錄後邏輯。

    public void doFilter(
        ServletRequest request, 
        ServletResponse response, 
        FilterChain chain 
    ) throws IOException, ServletException 
        { 
        Principal principal = request.getUserPrincipal(); 
    
        if(principal != null) { 
         UserWorkspace uwks = (UserWorkspace) getSession(request).getAttribute("com.foo.myproject.userworkspace"); 
    
         if (uwks == null) { 
          uwks = new UserWorkspace(principal); 
          getSession(request).setAttribute("com.foo.myproject.userworkspace", uwks); 
    
          // 
          // post-login code here 
          // 
    
         } 
        } 
    
        chain.doFilter(request, response); 
        }