使用Spring Security标记库时将exception映射到404页面

将exception映射到404页面时,Spring Security标记无法从安全上下文中查找身份validation信息。 使用“真实”404,可以找到认证。

我的web.xml:

 com.example.NotFoundException /app/404   404 /app/404  

在JSP上我有:

       

/app/404路径映射到只返回视图的控制器。 当我浏览到/foo/some_invalid_idNotFoundException会从控制器中抛出,最后当它进入JSP时,它无法在SecurityContext找到身份validation并呈现这两个选项中的任何一个。 相反,当我浏览/something_that_really_doesnt_exist它能够判断我是否登录并呈现正确的HTML。

将以下两个调度程序元素添加到spring security filter-mapping中:

  ... REQUEST ERROR  

默认情况下,只有普通请求才会通过定义的filter映射。

“INCLUDE”和“FORWARD”是另外两个有效的调度程序元素值。

最可能的情况是代码中的某些组件在exception处理时调用HttpSession.invalidate() 。 您可以通过简单的调试轻松找到它。

但实际上没有必要检查isAnonymous() – 它足以检查没有 ROLE_USER权限的用户:

  • 在Spring Security 2中:您可以使用标记的areNotGranted属性(请参阅Spring Security 2文档
  • 在Spring Security 3中:您可以使用Spring EL来评估负面条件: access="!hasRole('ROLE_USER')"