如何在Spring MVC中返回403 Forbidden?

Wil*_*ris 27 java spring

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

Chr*_*hie 31

你也可以扔掉

org.springframework.security.access.AccessDeniedException("403 returned");
Run Code Online (Sandbox Code Playgroud)

这将在响应头中返回403.

  • 这为我返回500. (4认同)
  • @Heady:这并不是最好的答案,因为它创建了对 Spring Security 的强烈依赖。乔的答案是创建自己的异常,这是我认为最好的答案。我仍然赞成那个,因为它是一个不错的选择。 (3认同)

yan*_*kee 27

创建一个使用@ResponseStatus注释的异常,例如:

@ResponseStatus(HttpStatus.FORBIDDEN)
public class ForbiddenException extends RuntimeException {
}
Run Code Online (Sandbox Code Playgroud)

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


Che*_*oft 12

匆匆

如果您使用的是纯JSP视图(最常见),那么只需添加即可

<% response.setStatus( 403 ); %>
Run Code Online (Sandbox Code Playgroud)

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

详情

在MVC中,我总是在视图中设置它,并且在大多数情况下使用Spring-MVC,使用它SimpleMappingExceptionResolver来呈现正确的视图以响应抛出的运行时异常.

例如:PermissionDeniedException在控制器或服务层中创建并抛出a ,并使异常解析器指向视图文件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>
Run Code Online (Sandbox Code Playgroud)

如果您需要实现用户登录机制,请查看Spring Security(以前称为Acegi Security).


Joe*_*dge 12

使用a ExceptionResolver是一种很好的方法,但是如果你只想让它与视图无关,你当然可以response.sendError(HttpServletResponse.SC_FORBIDDEN, "AdditionalInformationIfAvailable");在你的Controller中调用它.


小智 12

使用ResponseStatusException

@GetMapping("/demo")
public String demo(){
  if (forbidden){
    throw new ResponseStatusException(HttpStatus.FORBIDDEN); 
  }
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*ker 6

你能使用response.setStatus(403)吗?