我正在探索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>
现在,当我运行页面时,会在网址中添加一个标记:
http://localhost:8080/<project>/protected/facelet2.faces?javax.faces.Token=1426608965211
根据文档,如果令牌与服务器中的令牌不匹配,则不处理GET请求(我的理解是否正确?)。
但是如果我修改令牌(使用Firebug或浏览器中包含的开发工具),即使令牌被修改,仍然会处理请求。
我做错了吗?
答案 0 :(得分:5)
这是因为FacesServlet
显然映射到*.faces
的JSF 1.0样式的URL模式而不是*.xhtml
的JSF 2.0样式的URL模式。 <protected-views><url-pattern>
必须与浏览器地址栏中显示的实际网址格式匹配。
因此,如果实际网址为/protected/facelet2.faces
,则需要按以下方式对其进行配置:
<protected-views>
<url-pattern>/protected/facelet2.faces</url-pattern>
</protected-views>
然而,在此期间,我在当前的Mojarra 2.2.10实施中发现了一些令人讨厌的问题:
根据Servlet 12.1规范(there's even a vague comment in source code indicating that!)确实没有做前缀/后缀匹配。它只是一个完全匹配。这意味着,您无法使用/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
上明确地web.xml
{}显示{。}}。
<servlet-mapping>
<servlet-name>facesServlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
这样您就不需要处理虚拟URL。
我已经向Mojarra的家伙报告issue 3837。