如何在 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 响应)

授权策略总是返回 403(禁止)-MVC/API

带有帖子的 Spring WebMvcTest 返回 403