我在web.xml中声明了一个安全约束:
<security-constraint>
<web-resource-collection>
<web-resource-name>LoggedIn</web-resource-name>
<url-pattern>/screens/*</url-pattern>
</web-resource-collection>
<auth-constraint/>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
登录后,当我针对应用程序发出GET请求时,我得到了预期的行为,例如
https://localhost:8443/Patrac/screens/user.xhtml
- &gt;导致拒绝访问。
然而,当我做回发时,例如
<rich:menuItem submitMode="ajax" label="User" action="/screens/user"/>
我可以查看屏幕。如果我做第二次相同的回发,我会收到拒绝访问的消息。每次提交回发时,结果在显示屏幕和发出403之间交替显示。浏览器中显示的URL在以下内容之间交替显示:
https://localhost:8443/Patrac/screens/user.xhtml
- &gt;访问被拒绝时的浏览器URL
https://localhost:8443/Patrac/public/403.xhtml
- &gt;显示用户屏幕时的浏览器URL
我理解JSF中显示的浏览器URL落后于当前显示的屏幕的方式,所以这并不神秘。但我不明白我每次提交相同的回发时都能看到屏幕。同样,GET请求总是被拒绝。
编辑:
我确实尝试了post-redirect-get,这让奇怪的行为消失了,正如预期的那样。
<rich:menuItem submitMode="ajax" label="User" action="/screens/user?faces-redirect=true"/>
但是,我不想每次都做PRG,除了PRG并没有消除安全问题。
我在这里缺少什么?感谢您的任何见解!
答案 0 :(得分:1)
安全约束不会在转发时检查,而是在请求时检查。这是设计的。
所以你肯定需要PRG模式或更好的正常GET链接。它会立即使您的webapp更加SEO友好和更好的书签。无论如何,使用POST进行页面到页面导航都是糟糕的设计。
您看到的“交替行为”是因为未检查转发,但同一页面上的任何后续(回发)请求都是完整的请求,因此会进行检查。