我正在探索 JSF 2.2 中的新功能(到目前为止非常酷),但我仍然不明白受保护的视图是如何工作的,我创建了一个带有 Facelet2 链接的 Facelet1,如下所示:
<h:link styleClass="link" value="Go to protected page" id="link1"
outcome="/protected/facelet2.xhtml"></h:link>
在我的 faces-config.xml 中我添加了以下内容:
<protected-views>
<url-pattern>/protected/facelet2.xhtml</url-pattern>
</protected-views>
现在,当我运行页面时,会在 url 中添加一个令牌:
http://localhost:8080/<project>/protected/facelet2.faces?javax.faces.Token=1426608965211
根据文档,如果令牌与服务器中的令牌不匹配,则不会处理 GET 请求(我的理解正确吗?)。
但是,如果我修改令牌(使用 Firebug 或浏览器中包含的开发工具),即使令牌被修改,请求仍然会被处理。
难道我做错了什么?
这是因为你的FacesServlet
显然映射到 JSF 1.0 风格的 URL 模式*.faces
而不是 JSF 2.0 风格的 URL 模式*.xhtml
. The <protected-views><url-pattern>
必须与您在浏览器地址栏中看到的实际 URL 模式匹配。
因此,给定一个实际 URL/protected/facelet2.faces
,您需要如下配置:
<protected-views>
<url-pattern>/protected/facelet2.faces</url-pattern>
</protected-views>
However在此过程中,我发现了当前 Mojarra 2.2.10 实现中的一些令人讨厌的问题:
-
它实际上并没有按照 Servlet 12.1 规范进行前缀/后缀匹配(源代码中甚至有一个模糊的注释表明 http://grepcode.com/file/repo1.maven.org/maven2/org.glassfish/javax.faces/2.2.9/com/sun/faces/application/view/MultiViewHandler.java#273!)。它只是进行精确匹配。这意味着,您不能使用通配符 URL 模式,例如/protected/*
.
-
当生成<h:link>
,它不会将受保护的视图 URL 模式与已解析的 URL 进行比较,而是与 JSF 视图 ID 进行比较。并且,在检查传入请求时,它不会将请求 URL 与 JSF 视图 ID 进行比较(就像在链接生成期间一样),而是与<url-pattern>
。因此,这永远不会匹配,这完全解释了为什么您可以在没有有效令牌的情况下简单地访问它。
基本上,如果您需要保留 JSF 1.0 风格的 URL 模式,则需要以下配置*.faces
.
<protected-views>
<url-pattern>/protected/facelet2.xhtml</url-pattern>
<url-pattern>/protected/facelet2.faces</url-pattern>
</protected-views>
然后它会正确抛出javax.faces.application.ProtectedViewException
在没有有效令牌的情况下进行访问时。更好的是只绘制地图FacesServlet
明确地在*.xhtml
in web.xml
.
<servlet-mapping>
<servlet-name>facesServlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
这样您就永远不需要处理虚拟 URL。
我已将此事报告给 Mojarra 人员问题 3837 https://java.net/jira/browse/JAVASERVERFACES-3837.
也可以看看:
- 有时我看到 JSF URL 是 *.jsf,有时是 *.xhtml,有时是 /faces/*。为什么? https://stackoverflow.com/questions/3008395/jsf-facelets-sometimes-i-see-the-url-is-jsf-and-sometimes-xhtml-why
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)