3

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

因此,每当有人试图通过 URL 访问任何页面时,它都应该重定向到 Login 。

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

我将登录 Bean 存储在 Session 范围内。

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

提前致谢。

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

请给我建议。


文件夹中的我的登录页面

"/Common/Login.xhtml" 和一些页面

"/Admin/*.xhtml"

和一些页面

`"Employee/*.ahtml"` 

如何为这 2 个文件夹 Admin 和 Employee 设置过滤器

我给了这样的但请求没有进入Filter 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

2 回答 2

6

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

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

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

和我的过滤器类

 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);
    }
}
于 2012-07-24T08:12:00.597 回答
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

如果您不希望将 Spring 集成到您的项目中,那么我认为最好的方法是实现一个 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 bean 都可以作为 HttpSession 的属性找到,因此您将能够以这种方式从 SessionScoped 托管 bean 中检索登录用户。

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

于 2012-07-23T19:57:17.137 回答