31

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

4

5 回答 5

48

你也可以扔

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

这将在响应标头中返回 403。

于 2016-07-19T19:34:32.870 回答
44

创建一个带有@ResponseStatus注释的异常,例如:

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

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

于 2015-03-05T17:02:53.693 回答
13

匆匆

如果您使用的是纯 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)。

于 2008-09-05T11:35:15.937 回答
13

使用 anExceptionResolver是一个很好的方法,但如果你只想让它独立于视图,你当然可以response.sendError(HttpServletResponse.SC_FORBIDDEN, "AdditionalInformationIfAvailable");在你的 Controller 中调用 to。

于 2008-09-05T12:15:34.853 回答
6

使用这个: response.setStatus(403)

于 2008-09-05T11:22:57.697 回答