JSF PrettyFaces 导致过滤器链“中断”

Posted

技术标签:

【中文标题】JSF PrettyFaces 导致过滤器链“中断”【英文标题】:JSF PrettyFaces causing a Filter Chain-'break' 【发布时间】:2012-10-15 13:19:08 【问题描述】:

首先,在处理我的问题之前,我将向您介绍我的测试用例。 我的基本 Maven Web 应用程序中有几个组件:

page.xhtml:用于生成我的请求/回复(启动过滤) Pretty Faces:用于根据客户的需要重新定义 URL FirstFilter:在 Pretty Faces 之前执行(在这个体育场进行测试) ThirdFilter:在 Pretty Faces 之后执行(在这个体育场进行测试) web.xml:定义我的完整过滤器链的行为

我会分享重要组件的代码。

pretty-config.xml

<url-mapping id="page">
    <pattern value="/page" />
    <view-id value="/page.xhtml" />
</url-mapping>

FirstFilter.java

@WebFilter
public class FirstFilter implements Filter 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 
        System.out.println("FirstFilter, request: " + 
                ((HttpServletRequest)request).getRequestURL().toString());
        chain.doFilter(request, response);
        System.out.println("FirstFilter, response");
    

    // override init and destroy

ThirdFilter.java

@WebFilter
public class ThirdFilter implements Filter 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 
        System.out.println("ThirdFilter, request: " + 
                ((HttpServletRequest)request).getRequestURL().toString());
        chain.doFilter(request, response);
        System.out.println("ThirdFilter, response");
    

    // override init and destroy

web.xml

<filter>
    <filter-name>FirstFilter</filter-name>
    <filter-class>nl.mhoogeveen.nl.rootapplication.FirstFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>FirstFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
    <filter-name>Pretty Filter</filter-name>
    <filter-class>testingapplications.filterchaining.PrettyFilter</filter-class>
    <async-supported>true</async-supported>
</filter>
<filter-mapping>
    <filter-name>Pretty Filter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>ERROR</dispatcher>
    <dispatcher>ASYNC</dispatcher>
</filter-mapping>
<filter>
    <filter-name>ThirdFilter</filter-name>
    <filter-class>testingapplications.filterchaining.ThirdFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>ThirdFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

情况

调用 localhost:8080/page.xhtml(因此不会激活 Pretty Faces 重定向)

INFO: FirstFilter, request: http://localhost:8080/page.xhtml
INFO: ThirdFilter, request: http://localhost:8080/page.xhtml
INFO: ThirdFilter, response
INFO: FirstFilter, response

调用 localhost:8080/page(从而激活 Pretty Faces 重定向)

INFO: FirstFilter, request: http://localhost:8080/page
INFO: FirstFilter, response

问题

是什么导致了我的链不完整的这种情况?它不会被切断,因为我仍然会在 FirstFilter 上得到回复。似乎它永远不会到达 ThirdFilter。

我的web.xml 有什么问题吗,我错过了dispatcher 吗?

提前致谢。

【问题讨论】:

【参考方案1】:

您的调度程序设置不正确。让我解释一下会发生什么:

/page 的请求进来,首先由FirstFilter 处理。之后 PrettyFaces 拦截请求并将其转发给/page.xhtml。这个转发的请求被作为一个新请求处理,因此再次通过过滤器链。但是您的过滤器没有任何与设置&lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt; 相同的调度程序设置。在此配置中,过滤器仅适用于常规请求,而不适用于转发请求。

如果您还想对转发的请求应用过滤器,则必须将&lt;dispatcher&gt;FORWARD&lt;/dispatcher&gt; 添加到过滤器配置中。

这也是您通常必须调整 MyFaces Tomahawk / PrimeFaces 等 3 方过滤器的调度程序设置的原因。请参阅常见问题解答中的问题 2:

http://ocpsoft.org/prettyfaces/#section-16

【讨论】:

绝妙的答案。我已经认为我的调度员错了,但我知道对请求的实际处理方式有很多了解。我正在阅读这些调度程序,但您的解释要清楚得多。谢谢 Chkal!

以上是关于JSF PrettyFaces 导致过滤器链“中断”的主要内容,如果未能解决你的问题,请参考以下文章

Primefaces FileUpload 与 PrettyFaces 和 JSF 2.2.3

JSF 和 PrettyFaces - 如何限制直接 xhtml 请求

JSF2 和 PrettyFaces...如何获取原始 URL 或查询字符串?

使用 PrettyFaces 获取原始请求 URI

结合 PrettyFaces 和 PicketLink

使用带有网络过滤器的漂亮面孔