10

使用 Tomcat 7 --- Primefaces 3.4.1 --- javax faces 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>

login(welcome) 和 register 页面位于“public”文件夹中,它们的 web 过滤器使用注释定义:@WebFilter("/public/*")

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

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

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

2)我还想阻止用户输入原始网址。我知道漂亮的面孔完全隐藏了原始网址,但有没有办法做到这一点?

--已解决-- 感谢 BalusC

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

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

4

1 回答 1

13

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

Servlet 过滤器在没有任何映射时<dispatcher>,默认情况下仅侦听“初始”请求,而不是转发、包含或错误请求。

因此,当您在 PrettyFacesweb.xml 之后映射另一个 servlet 过滤器时,默认情况下不会触发它,除非您在默认值旁边显式设置一个<dispatcher>on (您应该保留这个,以防 PrettyFaces 实际上不需要执行前锋)。FORWARDREQUEST

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

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

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

或者,如果有问题的过滤器没有以任何方式更改请求/响应目标,例如设置字符集、使用 Gzip 压缩、监听异常等,那么您也可以将其放在PrettyFaces之前。

于 2013-03-25T01:21:18.633 回答