如果用户未登录到JSF,重定向到登录页面

问题描述:

我正在开发一个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> 

其进入无限循环请给您的解决方案,这个概率

我解决了这个问题。 我的过滤器映射

<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/* url-pattern>替换整个'if(path.contains(“/ Admin /”)|| path.contains(“/ Employee /”)){' /Employee/* url-pattern>'而不是'/* url-pattern>'。 – BalusC 2012-07-24 11:44:56

+0

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

的方式我决定处理这个相同的问题是使用与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