使用带有网络过滤器的漂亮面孔
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()
将请求转发到所需的目标资源。
当映射时没有任何<dispatcher>
时,Servlet 过滤器默认仅侦听“初始”请求,而不是转发、包含或错误请求。
因此,当您在 web.xml
中映射另一个 servlet 过滤器时,在 PrettyFaces 过滤器之后,默认情况下它不会被触发,除非您在 FORWARD
旁边明确设置 <dispatcher>
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()
)。
我了解我的朋友,会检查一下。再次感谢您。以上是关于使用带有网络过滤器的漂亮面孔的主要内容,如果未能解决你的问题,请参考以下文章