2012-07-23 143 views
2

我正在開發一個JSF應用程序。 這僅適用於Authourised用戶。如果用戶未登錄到JSF,重定向到登錄頁面

所以每當有人試圖通過URL訪問任何頁面,它應該重定向到登錄。

我使用XHTML作爲前端。並使用JSF框架。

而我在會話範圍中存儲登錄Bean。

不幸的是我已經使用Servlets和靜態頁面「response.sendRedirect()」。

在此先感謝。

我認爲一種解決方案是將所有頁面放入WEB-INF中,但一個問題是我正在使用resonse.sendRedirect() 以及我正在使用帶有facelets的模板。

請給我建議。


在文件夾

"/Common/Login.xhtml" 我的登錄頁面,並在

"/Admin/*.xhtml" 

某些頁面,有些頁面在

`"Employee/*.ahtml"` 

如何設置過濾器,這些2個文件夾管理和員工

我給喜歡這一點,但要求不enering進入過濾器的Servlet

<filter-mapping>  
    <filter-name>LoginFilter</filter-name> 
     <url-pattern>/faces/Admin/*</url-pattern>  
    <url-pattern>/faces/Employee/*</url-pattern>   
<dispatcher>REQUEST</dispatcher> 
     <dispatcher>FORWARD</dispatcher> 
    </filter-mapping>` 

如果我給這樣的

<url-pattern>/*</url-pattern> 

其進入無限循環請給您的解決方案,這個概率

回答

4

我解決了這個問題。 我的過濾器映射

<filter-mapping> 
    <filter-name>LoginFilter</filter-name> 
    <url-pattern>/*</url-pattern> 

    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping> 

和我的Filter類

public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) 
     throws IOException, ServletException { 
    System.out.println("Entered intop Login Filter"); 
    HttpServletRequest req = (HttpServletRequest) request; 
    LoginBean login = (LoginBean) req.getSession().getAttribute("login"); 
    String path = req.getRequestURI().substring(req.getContextPath().length()); 
    System.out.println("path:" + path); 

    if (path.contains("/Admin/") || path.contains("/Employee/")) { 
     if (login != null) { 
      if (login.getUsername() != null && !login.getUsername().equals("")) { 
       chain.doFilter(request, response); 
      } else { 
       HttpServletResponse res = (HttpServletResponse) response; 
       res.sendRedirect("/EMS2/faces/Html/Common/Login.xhtml"); 
      } 
     } else { 
      HttpServletResponse res = (HttpServletResponse) response; 
      res.sendRedirect("/EMS2/faces/Html/Common/Login.xhtml"); 
     } 


    } else { 
     chain.doFilter(request, response); 
    } 
} 
+0

你可以用'/Admin/*替換整個'if(path.contains(「/ Admin /」)|| path.contains(「/ Employee /」)){' /Employee/*'而不是'/*'。 – BalusC 2012-07-24 11:44:56

+0

它不工作 – 2012-07-27 08:57:30

1

的方式我決定處理這個相同的問題是使用與Spring和Spring Security 3集成的JSF2。一個很好的教程和示例項目可以在這裏找到如何適當地做到這一點。

http://technology-for-human.blogspot.com/2010/12/jsf-2-with-spring-3-basics-part-1-of-2.html

如果您不希望春天集成到你的項目那麼最好的辦法我能想到這樣做,這將是實現一個Servlet過濾器,將授權或它到達之前拒絕的HTTP請求FacesServlet的。

<filter> 
    <filter-name>securityFilter</filter-name> 
    <filter-class>org.company.filters.SecurityFilter</filter-class> 
    </filter> 
    <filter-mapping> 
    <filter-name>securityFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
    </filter-mapping> 

存在的任何SessionScoped豆可以發現在HttpSession的屬性,所以你將能夠檢索已登錄的用戶從SessionScoped以這種方式管理的Bean。

此時授權應該很簡單。如果登錄用戶不應該查看此頁面,則將用戶重定向到未經授權的頁面。

+1

我採取了同樣的路,你的這個問題。我在SpringSource上發現了來自Mike Weisner的網絡研討會,作爲一個提供信息的手錶來向我展示該做什麼:-) http://www.infoq.com/presentations/Spring-Security-3 – 8bitjunkie 2012-07-24 16:24:20

+0

@ 7SpecialGems整潔的演示...謝謝共享的! – 2012-07-24 16:38:49

相關問題