我正在探索JSF2.2中的新特性(到目前为止非常酷),但我仍然不明白受保护的视图是如何工作的,我创建了一个带有指向facelet2的链接的facelet2,如下所示:
<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或浏览器中包含的dev工具),请求仍然会被处理,即使令牌被修改了。
我做错了什么吗?
发布于 2015-03-17 17:49:40
这是因为您的FacesServlet显然是映射在*.faces的JSF1.0风格的URL模式上,而不是JSF2.0风格的*.xhtml模式上。<protected-views><url-pattern>必须与您在浏览器地址栏中看到的实际URL模式匹配。
因此,给定/protected/facelet2.faces的实际URL,您需要按以下方式配置它:
<protected-views>
<url-pattern>/protected/facelet2.faces</url-pattern>
</protected-views>然而,在上发现了当前Mojarra2.2.10实现中的一些棘手问题:
/protected/*这样的通配符URL模式。<h:link>时,它不会将受保护的视图URL模式与解析的URL进行比较,而是与JSF视图ID进行比较。而且,在检查传入的请求时,它不会将请求URL与JSF进行比较(就像在链接生成期间一样),而是与<url-pattern>进行比较。因此,这永远不匹配,完全解释了为什么您可以在没有有效令牌的情况下简单地访问它。基本上,如果需要保留*.faces的JSF1.0风格的URL模式,则需要进行以下配置。
<protected-views>
<url-pattern>/protected/facelet2.xhtml</url-pattern>
<url-pattern>/protected/facelet2.faces</url-pattern>
</protected-views>在没有有效令牌的情况下被访问时,它将正确地抛出javax.faces.application.ProtectedViewException。更好的方法是在FacesServlet中的*.xhtml上显式地映射web.xml。
<servlet-mapping>
<servlet-name>facesServlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>这样,您就不需要处理虚拟URL。
我已经把这件事报告给了莫吉拉人,名叫第3837期。
另请参阅:
https://stackoverflow.com/questions/29104597
复制相似问题