如何在 Spring MVC 中返回 403 Forbidden?
Posted
技术标签:
【中文标题】如何在 Spring MVC 中返回 403 Forbidden?【英文标题】:How do I return a 403 Forbidden in Spring MVC? 【发布时间】:2010-09-07 21:58:12 【问题描述】:当用户没有查看特定页面的权限时,我希望我的控制器返回正确的 HTTP 响应代码。
【问题讨论】:
【参考方案1】:你也可以扔
org.springframework.security.access.AccessDeniedException("403 returned");
这会在响应标头中返回 403。
【讨论】:
这很有效,应该是公认的答案,因为它最灵活。 @Heady :并不是最好的答案,因为它与 Spring Security 建立了强依赖关系。乔的回答是创建自己的例外,是最好的 IMO。我仍然赞成那个,因为它是一个不错的选择。 这会为我返回 500。【参考方案2】:创建一个带有 @ResponseStatus 注释的异常,例如像这样:
@ResponseStatus(HttpStatus.FORBIDDEN)
public class ForbiddenException extends RuntimeException
现在只需在您的处理程序方法中抛出该异常,响应将具有状态 403。
【讨论】:
【参考方案3】:速成
如果您使用的是纯 JSP 视图(这是最常见的),那么只需添加
<% response.setStatus( 403 ); %>
在您的视图文件中的某个位置。顶部是一个不错的地方。
详情
在 MVC 中,我总是在视图中设置它,并且在大多数情况下使用 Spring-MVC,使用 SimpleMappingExceptionResolver
来呈现正确的视图以响应抛出的运行时异常。
例如:在控制器或服务层中创建并抛出PermissionDeniedException
,并让异常解析器指向视图文件permissionDenied.jsp
。此视图文件设置 403 状态并向用户显示适当的消息。
在您的 Spring bean XML 文件中:
<bean id="exceptionResolver"
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="PermissionDeniedException">
rescues/permissionDenied
</prop>
... set other exception/view mappings as <prop>s here ...
</props>
</property>
<property name="defaultErrorView" value="rescues/general" />
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
如果您需要实现用户登录机制,请查看Spring Security(以前称为 Acegi Security)。
【讨论】:
为什么需要 response.setStatus?在响应之后(在 Tomcat 中),响应的 http 响应代码似乎有一些战略演变 - 它首先是 200(默认),然后在 Spring DispatcherServlet 处理时移动到 404(为了参数)处理程序异常,然后,呈现视图并将代码设置为 500(这很奇怪),然后 setStatus 确实通过将响应的代码恢复为 404 来解决问题。【参考方案4】:使用ExceptionResolver
是一个很好的方法,但如果您只想让它独立于视图,您当然可以在控制器中调用response.sendError(HttpServletResponse.SC_FORBIDDEN, "AdditionalInformationIfAvailable");
。
【讨论】:
【参考方案5】:使用这个:
response.setStatus(403)
.
【讨论】:
以上是关于如何在 Spring MVC 中返回 403 Forbidden?的主要内容,如果未能解决你的问题,请参考以下文章
Jquery POST在spring mvc中给出403禁止错误
AJAX / Spring MVC - 没有 Spring Security 的 403 禁止错误
Ajax 调用在我的 ASP.NET MVC 4 项目中偶尔返回 403 错误
Spring MVC(或 Spring Boot)。针对安全相关异常(例如 401 Unauthorized 或 403 Forbidden)的自定义 JSON 响应)