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

如果用户未在JSF中登录,则重定向到登录页面,jsf,redirect,login,Jsf,Redirect,Login,我正在开发一个JSF应用程序。 这仅适用于授权用户 所以,每当有人试图通过URL访问任何页面时,它都应该重定向到登录 我使用XHTML作为前端。并使用JSF框架 我将登录Bean存储在会话范围中 不幸的是,我使用了servlet和静态页面“response.sendRedirect()” 提前谢谢 我认为一种解决方案是将所有页面放在WEB-INF中,但一个问题是我正在使用resonse.sendRedirect() 我也在使用Facelet模板 请推荐我 文件夹中的我的登录页 “/Common

我正在开发一个JSF应用程序。 这仅适用于授权用户

所以,每当有人试图通过URL访问任何页面时,它都应该重定向到登录

我使用XHTML作为前端。并使用JSF框架

我将登录Bean存储在会话范围中

不幸的是,我使用了servlet和静态页面“response.sendRedirect()”

提前谢谢

我认为一种解决方案是将所有页面放在WEB-INF中,但一个问题是我正在使用resonse.sendRedirect() 我也在使用Facelet模板

请推荐我


文件夹中的我的登录页

“/Common/Login.xhtml”
和中的一些页面

"/Admin/*.xhtml"
还有几页

`"Employee/*.ahtml"` 
如何为管理员和员工这两个文件夹设置筛选器

我像这样给出了请求,但请求并没有削弱到过滤器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>` 

逻辑过滤器
/faces/Admin/*
/面孔/员工/*
要求
向前地
` 
如果我这样给予

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

它将进入无限循环请给出这个问题的解决方案

我决定处理这个问题的方法是使用JSF2与Spring和Spring Security 3集成。一个很好的教程和示例项目可以在这里找到如何适当地做到这一点

如果您不希望将Spring集成到您的项目中,那么我认为最好的方法是实现一个servlet过滤器,它将在HTTP请求到达FacesServlet之前授权或拒绝HTTP请求

  <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>

安全过滤器
org.company.filters.SecurityFilter
安全过滤器
/*
要求
向前地
任何存在的SessionScoped bean都可以作为HttpSession的属性找到,因此您将能够以这种方式从SessionScoped托管bean检索登录用户

此时授权应该很简单。如果登录用户不应查看此页面,则将用户重定向到未经授权的页面。

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

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

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

如果(path.contains(“/Admin/”)| | path.contains(“/Employee/”),可以替换整个
){
通过使用
/Admin/*/Employee/*
而不是
/*
来阻止。在这个问题上,我和你走的是同一条路。我发现SpringSource的Mike Weisner的这个网络研讨会是一个信息丰富的手表,告诉我该怎么做:-@7SpecialGems整洁的演示文稿…谢谢分享!
 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);
    }
}