Jsf 通过web过滤器使用漂亮的面孔
使用Tomcat 7---Primefaces 3.4.1---javax faces 2.1.17---prettyfaces-jsf2 3.3.3 我在我的项目中正确地配置了BeartyFaces,但是我的web过滤器无法处理由BeartyFaces编写的新URL 下面是一个pretty-config.xml示例Jsf 通过web过滤器使用漂亮的面孔,jsf,jsf-2,primefaces,prettyfaces,Jsf,Jsf 2,Primefaces,Prettyfaces,使用Tomcat 7---Primefaces 3.4.1---javax faces 2.1.17---prettyfaces-jsf2 3.3.3 我在我的项目中正确地配置了BeartyFaces,但是我的web过滤器无法处理由BeartyFaces编写的新URL 下面是一个pretty-config.xml示例 <url-mapping id="home"> <pattern value="/home"/> <view-id value="/s
<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/*)
漂亮的URL工作正常,但这些过滤器只有在我编写原始URL时才起作用。
1) 如何修复我的网络过滤器
2) 我还想阻止用户输入原始url。我知道BeartyFaces完全隐藏了原始url,但有办法吗
--已解决——感谢巴卢斯克
如果使用注释定义过滤器,则可以配置dispatcher设置,如
@WebFilter(urlPatterns=“/public/*”,dispatcherTypes={DispatcherType.REQUEST,DispatcherType.FORWARD})PrettyFaces使用许多URL重写解决方案将请求转发到所需的目标资源 Servlet筛选器在映射时没有任何
,默认情况下只侦听“初始”请求,而不侦听转发的、包含的或出错的请求
因此,当您将web.xml
中的另一个servlet过滤器映射到PrettyFaces过滤器之后时,默认情况下不会触发它,除非您在FORWARD
上显式地将
设置在REQUEST
的默认值旁边(您应该保留此过滤器,以防PrettyFaces实际上不需要执行转发)
或者,如果所讨论的筛选器没有以任何方式更改请求/响应目标,例如设置字符集、使用Gzip压缩、侦听异常等,那么您也可以将其放在PrettyFaces之前。我在我的web.xml、BalusC中没有指定任何筛选器。因为我使用的是version=“3.0”“而且,pretty正在按照文档中所写的方式自动配置自己。此外,我的web过滤器还使用注释明确定义。我必须直接在web.xml上为dispatcher设置定义它吗?谢谢@BalusC,它工作得很好@WebFilter(urlPatterns=“/public/*”,dispatcherTypes={DispatcherType.REQUEST,DispatcherType.FORWARD})解决了我的问题。但我想问一个小问题,更新或刷新同一个页面(例如使用primefaces poll)总是被过滤器捕获,实际上这是完全正常的。但是有没有办法逃避呢?你可以把过滤器映射到一个更具体的URL模式上。或者,如果您只是担心过滤器是一项相对昂贵的工作,您也可以通过添加
if(“部分/ajax.equals”(“request.getHeader”(“Faces request”))
来预先检查它是否是JSF ajax请求,以便快速跳过整个过滤器工作(只需调用FilterChain\doFilter()
),我去看看。再次感谢你。
<filter-mapping>
...
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
@WebFilter(..., dispatcherTypes = { REQUEST, FORWARD })