代码之家  ›  专栏  ›  技术社区  ›  Will Harris

如何返回春季MVC中禁止使用的403?

  •  26
  • Will Harris  · 技术社区  · 16 年前

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

    5 回复  |  直到 8 年前
        1
  •  12
  •   Cheekysoft Moz Morris    16 年前

    速食

    如果您使用的是普通的JSP视图(这是最常见的),那么只需添加

    <% response.setStatus( 403 ); %>
    

    在视图文件中的某个位置。在顶部是个不错的地方。

    细节

    在MVC中,我总是在视图中设置它,在大多数情况下,对于SpringMVC,使用 SimpleMappingExceptionResolver 为了响应抛出的运行时异常而呈现正确的视图。

    例如:创建并抛出 PermissionDeniedException 在控制器或服务层中,让异常解析器指向视图文件 permissionDenied.jsp . 此视图文件设置403状态并向用户显示适当的消息。

    在SpringBean 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)。

        2
  •  27
  •   Chris Ritchie    8 年前

    你也可以扔

    org.springframework.security.access.AccessDeniedException("403 returned");
    

    这将在响应头中返回403。

        3
  •  22
  •   yankee    10 年前

    创建用注释的异常 @ResponseStatus 像这样:

    @ResponseStatus(HttpStatus.FORBIDDEN)
    public class ForbiddenException extends RuntimeException {
    }
    

    现在只需在处理程序方法中抛出该异常,响应的状态将为403。

        4
  •  12
  •   Joe Liversedge    16 年前

    使用一个 ExceptionResolver 这是一个很好的方法,但是如果你只想让它独立于视图,你当然可以打电话给 response.sendError(HttpServletResponse.SC_FORBIDDEN, "AdditionalInformationIfAvailable"); 在你的控制器里。

        5
  •  5
  •   John Boker    8 年前

    你能用response.setstatus(403)吗?