使用漂亮的脸与web过滤器

时间:2013-03-25 01:14:03

标签: jsf jsf-2 primefaces prettyfaces

使用Tomcat 7 --- Primefaces 3.4.1 --- javax面临2.1.17 --- prettyfaces-jsf2 3.3.3

我在项目中正确配置了漂亮的面孔但是我的网页过滤器没有使用由漂亮的面孔编写的新网址。

这是一个示例pretty-config.xml

<url-mapping id="home">
    <pattern value="/home"/>
    <view-id value="/secure/homepage.xhtml"/>
</url-mapping>

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

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

<url-mapping id="profile">
    <pattern value="/profile/#{userId}"/>
    <view-id value="/profile.xhtml"/>
</url-mapping>

登录(欢迎)和注册页面位于“public”文件夹中,其Web过滤器使用注释定义: @WebFilter(“/ public / *”)

对于我在“安全”文件夹中的主页(文件夹中会有更多页面),我还定义了一个Web过滤器及其注释: @WebFilter(“/ secure / *)

漂亮的网址工作正常,但这些过滤器只在我写原始网址时才有效。

1)我如何修复我的网页过滤器?

2)我还想阻止用户输入原始网址。我知道漂亮的面孔完全隐藏了原始网址但是有办法吗?

- 已解决 - 感谢BalusC

如果您使用注释定义了过滤器,则可以配置调度程序设置,如

@WebFilter(urlPatterns =“/ public / *”, dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD}

1 个答案:

答案 0 :(得分:12)

PrettyFaces使用许多URL重写解决方案RequestDispatcher#forward()将请求转发到所需的目标资源。

Servlet过滤器在没有任何<dispatcher>的映射时,默认只在“初始”请求上进行侦听,而不是在转发,包含或错误请求上进行侦听。

因此,当您在之后在web.xml 中映射另一个servlet过滤器时,默认情况下不会触发它,除非您在<dispatcher>上明确设置FORWARD默认情况下REQUEST旁边的{1}}(你应该保留这个,因为PrettyFaces实际上不需要执行转发)。

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

或者,对于您在过滤器上使用@WebFilter的情况,请使用dispatcherTypes属性:

@WebFilter(..., dispatcherTypes = { REQUEST, FORWARD })

或者,如果所讨论的过滤器没有以任何方式改变请求/响应目标,例如,设置charset,使用Gzip压缩,侦听异常等,然后你也可以在之前将它放在PrettyFaces之前。