Spring 安全标签在错误页面中不起作用
Posted
技术标签:
【中文标题】Spring 安全标签在错误页面中不起作用【英文标题】:Spring security tags do not work in error pages 【发布时间】:2013-04-29 21:18:04 【问题描述】:对于我希望处理的每个错误代码,我都有自定义错误页面,尽管我发现 spring-security 标记在使用这些页面时不起作用。例如,下面只显示“一个”:
<%@ page session="false" %>
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
<p>One</p>
<sec:authorize access="isAuthenticated()">
<p>Two</p>
</sec:authorize>
<sec:authorize access="!isAuthenticated()">
<p>Three</p>
</sec:authorize>
具体来说,我的目标是我的web.xml
提供的错误页面,即
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/error/404-layout.jsp</location>
</error-page>
在我的控制器中,我抛出了一个名为ResourceNotFoundException
的RuntimeException
,并用@ResponseStatus(value = HttpStatus.NOT_FOUND)
注释了找不到实体的位置。这会正确重定向到错误页面。
不起作用的正是上面所解释的,弹簧安全标签中的任何内容都不会呈现,无论是导致true
还是false
,如我的示例所示,这两个标签都不会产生输出。
【问题讨论】:
【参考方案1】:如果页面是为通过 Spring Security 过滤器链的请求而呈现的,则标签只会“工作”(您可能应该澄清“不工作”的意思)。
您在web.xml
中声明的错误页面将由容器直接处理,据我所知,没有办法告诉它对它们应用过滤器映射。
【讨论】:
正确吗?它不是已经通过链条到达控制器了吗?控制器将抛出ResourceNotFoundException
。我想另一种方法是设置一个错误页面映射到静态路径的弹簧控制器。
我不确定您指的是什么控制器。你能否在你的问题中澄清你在谈论什么类型的错误页面(你的意思是那些在你的web.xml
或其他东西中使用error-page
定义的错误页面)以及实际上什么不起作用?
老实说,我不确定 servlet 规范是否为您提供了关于如何处理 error-page
页面的任何保证。它甚至可能是特定于容器的。无论如何,它们通常非常简单。您可能想通过从一个中转储堆栈来检查它包含的内容。
我已按要求进行了更新,我的示例说明了我的意思是不工作,输入的两个标签提供了尝试输出已验证和未验证块的示例,均不产生输出。
【参考方案2】:
有一个解决方案 - 请参阅答案 https://***.com/a/6199119 - 将这些附加信息添加到 web.xml 中的过滤器映射就足够了:
<filter-mapping>
...
<dispatcher>REQUEST</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
【讨论】:
以上是关于Spring 安全标签在错误页面中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot DevTools 在 Eclipse 中不起作用
Spring Security with hibernate:hasRole() 在配置中不起作用