2012-10-25 56 views
2

首先,我会在处理我的问题之前向您介绍我的测试用例。 有我的基本Maven的web应用的几个组成部分:JSF PrettyFaces导致过滤器链'破坏'

  • page.xhtml:用于生成我的请求/应答(启动过滤)
  • 漂亮的面孔:基于需求中重新定义的URL,我客户
  • FirstFilter:要漂亮的面孔之前执行(在这个体育场用于测试目的)
  • ThirdFilter:要漂亮的面孔后执行(在这个体育场用于测试目的)
  • web.xml中:定义行为我的完整过滤器链

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

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

现状

调用本地主机:8080/page.xhtml(并因此不是激活漂亮的面孔重定向)

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

调用本地主机:8080 /页面(并因此激活漂亮脸部重定向)

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

问题

是什么原因造成这种情况在我的链将是不完整?它不会被切断,因为我仍然在FirstFilter上得到我的回应。它似乎没有达到ThirdFilter。

我的web.xml有什么问题,我是否缺少dispatcher

在此先感谢。

回答

6

您的调度员设置不正确。让我解释发生了什么:

/page的请求进入并且首先由FirstFilter处理。之后,PrettyFaces截获请求并将其转发至/page.xhtml。这个转发的请求被作为一个新的请求处理,因此会再次思考过滤器链。但是您的过滤器没有任何调度员设置,与设置<dispatcher>REQUEST</dispatcher>相同。在这个配置中,过滤器仅适用于常规请求,而不适用于转发请求。

如果您还想将过滤器应用于转发的请求,则必须将<dispatcher>FORWARD</dispatcher>添加到过滤器配置中。

这也是为什么你通常要对第三方滤镜像MyFaces的战斧/ PrimeFaces调整调度设置等请参见常见问题解答问题2:

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

+0

精湛的答案。我已经认为我的调度员是错误的,但我确实知道很多关于实际处理请求的方式。我正在读这些调度员,但你的解释更清楚。感谢Chkal! – Aquillo

+0

好的问题,甚至更好的答案=好的线程 –