JSF 过滤器跳过一些文件

Posted

技术标签:

【中文标题】JSF 过滤器跳过一些文件【英文标题】:JSF Filter skip some files 【发布时间】:2012-05-12 04:53:00 【问题描述】:

我有一个具有这种结构的项目(我无法更改):

Web Pages
   META-INF
   WEB-INF
   assets (javascript, css and images)
   includes (top.xhtml, bottom.xhtml, etc)
   templates (master.xhtml)
   views
      fornecedor
         -home.xhtml
         -user.xhtml
         -login.xhtml
      franqueador
         -home.xhtml
         -user.xhtml
         -login.xhtml

每个文件夹都有一个login.xhtml 是有原因的,我不能更改它,它是由项目经理传递的。

这是我的会话过滤器:

@WebFilter("/views/*")
public class SessionFilter implements Filter 

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException 
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        HttpSession session = request.getSession(false);
        LoginController loginController = (LoginController) ((boolean) (session != null) ? session.getAttribute("loginController") : null);
        if (!request.getRequestURI().endsWith("/fornecedor/index.xhtml")) 
            if (loginController == null || !loginController.getIsLoggedIn()) 
                response.sendRedirect(request.getContextPath()
                        + "/views/index.xhtml");
             else 
                chain.doFilter(req, res);
            
        
    



它不起作用,返回一个没有 html 代码的空白页面,当我将 .xhtml 更改为 .html 时,它给了我一个重定向循环。

我需要避开我所有的login.xhtml 页面和views 文件夹上的index.xhtml。我已经在我的过滤器上调试了if,但它总是返回false

编辑

按照 BalusC 的回答,我得出了这个结论:

if (!request.getRequestURI().endsWith("/views/index.html")
                && !request.getRequestURI().endsWith("/views/fornecedor/login.html")
                && !request.getRequestURI().endsWith("/views/franqueado/login.html")
                && (loginController == null || !loginController.getIsLoggedIn())) 
            response.sendRedirect(request.getContextPath() + "/views/index.html");

         else 
            chain.doFilter(req, res);
        

它正在工作,但还有另一个问题,如果我有 10 个文件夹,我需要将它们添加到这个 if 语句中......我需要让它自动。

【问题讨论】:

【参考方案1】:

您的第一个if 条件没有else。这就解释了空白页。

您需要在单个 if 中评估 URL 和登录条件。

if (!request.getRequestURI().endsWith("/fornecedor/index.xhtml") && (loginController == null || !loginController.getIsLoggedIn()) 
    response.sendRedirect(request.getContextPath() + "/views/index.xhtml");
 else 
    chain.doFilter(req, res);

关于重定向循环,这是因为您的FacesServlet 映射到*.html 而不是*.xhtml 的URL 模式,原因不明。所以请求 URL 永远不会匹配。相应地修复过滤器中的 URL。要将其推广到所有 login.htmlindex.html 请求,只需执行以下操作:

if (!request.getRequestURI().endsWith("/index.html") 
    && !request.getRequestURI().endsWith("/login.html") 
    && (loginController == null || !loginController.getIsLoggedIn())

    response.sendRedirect(request.getContextPath() + "/views/index.html");
 else 
    chain.doFilter(req, res);

【讨论】:

您好,感谢您的回答,但是@WebFilter("/views/*") 呢?就这样吧? 此注解在应用程序中注册过滤器并让它在匹配/views/* 的 URL 模式上运行。如果您删除它,过滤器将根本不会注册,因此根本不会运行。 但在我的情况下,我的views 文件夹中有一些文件夹,正确的选择是这样吗? @WebFilter("/views/*") 它将在每个匹配 /views/* 的 URL 模式上运行,因此也将在 /views/someotherfolder/file.xhtml 上运行。但是,我再次阅读了您的问题,似乎您实际上在每个文件夹中也有一个 index.xhtml(即使您没有在文件夹结构示例中显示它)并且您想以与login.xhtml 相同的方式对待index.xhtml。这是真的?也不清楚您的 FacesServlet 映射到什么 URL 模式。是*.xhtml 还是*.html?过滤器中检查的请求 URL 和重定向的 URL 必须与该 URL 模式完全匹配。 我的文件夹中没有index.xhtml,只有views,URL 格式为html

以上是关于JSF 过滤器跳过一些文件的主要内容,如果未能解决你的问题,请参考以下文章

如何从过滤器中读取 JSF 会话 bean?

JSF过滤器在初始重定向后不重定向[关闭]

在 Web 过滤器中访问会话范围的 JSF 托管 bean

Primefaces FileUpload 与 PrettyFaces 和 JSF 2.2.3

带有 JSF 的 Servlet 过滤器

如何在 JSF 中实现登录过滤器?