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

有帮助吗?

解决方案

匆匆

如果您使用普通 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>

如果你需要实现用户登录机制,请看一下 春季安全 (原 Acegi 安全公司)。

其他提示

你也可以直接扔

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

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

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

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

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

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

用这个:response.setStatus(403).

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top