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

Posted

技术标签:

【中文标题】使用带有网络过滤器的漂亮面孔【英文标题】:using pretty faces with web filters 【发布时间】:2013-03-14 10:14:13 【问题描述】:

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

我在项目中正确配置了漂亮的面孔,但我的网络过滤器无法使用漂亮面孔编写的新网址。

这是一个漂亮的配置.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/*")

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

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

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

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

-- 已解决 -- 感谢 BalusC

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

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

【问题讨论】:

【参考方案1】:

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

当映射时没有任何&lt;dispatcher&gt; 时,Servlet 过滤器默认仅侦听“初始”请求,而不是转发、包含或错误请求。

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

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

或者,如果您在过滤器上使用@WebFilter,请使用dispatcherTypes 属性:

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

或者,如果相关过滤器不会以任何方式更改请求/响应目标,例如设置字符集、使用 Gzip 压缩、监听异常等,然后您也可以将其放在 PrettyFaces 之前

【讨论】:

我没有在我的 web.xml 中指定任何过滤器,BalusC。因为我使用的是 version="3.0" 并且漂亮的是按照文档中的说明自动配置自己。我的网络过滤器也用注释明确定义。我要直接在 web.xml 上为调度程序设置定义它吗? 谢谢@BalusC,它工作得很好。 @WebFilter(urlPatterns = "/public/*", dispatcherTypes = DispatcherType.REQUEST, DispatcherType.FORWARD) 解决了我的问题。但我想问一个小问题,更新或刷新同一页面(例如使用 primefaces poll)总是被过滤器捕获,实际上它完全正常。但是有没有办法逃脱它? 您可以将过滤器映射到更具体的 URL 模式。或者,如果您只是担心过滤器是一项相对昂贵的工作,您还可以通过添加 if ("partial/ajax".equals(request.getHeader("Faces-Request"))) 来预先检查它是否是 JSF ajax 请求,以快速跳过整个过滤器工作(只需调用 FilterChain#doFilter() )。 我了解我的朋友,会检查一下。再次感谢您。

以上是关于使用带有网络过滤器的漂亮面孔的主要内容,如果未能解决你的问题,请参考以下文章

包含漂亮面孔后,命令按钮不会调用它的操作方法

MongoDB 最佳匹配过滤器

使用游标适配器实现带有过滤器的多选列表视图

R如何使用带有过滤器或过滤器_的卷曲卷曲?

如何使用 int 数组创建带有面孔和西装的卡片组?

优化数据库有啥更好的方法:使用带有不同过滤器的一堆存储过程,还是使用带有 if 条件的单个存储过程?