【问题标题】:How do I return a 403 Forbidden in Spring MVC?如何在 Spring MVC 中返回 403 Forbidden?
【发布时间】:2010-09-07 21:58:12
【问题描述】:

当用户没有查看特定页面的权限时,我希望我的控制器返回正确的 HTTP 响应代码。

【问题讨论】:

    标签: java spring http-status-code-403 httpforbiddenhandler


    【解决方案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).

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-01-22
          • 1970-01-01
          • 1970-01-01
          • 2016-11-23
          • 2012-08-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多