Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 通过web过滤器使用漂亮的面孔_Jsf_Jsf 2_Primefaces_Prettyfaces - Fatal编程技术网

Jsf 通过web过滤器使用漂亮的面孔

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

使用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="/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 })