AccessDeniedHandler和ResponseEntityExceptionHandler之间的区别

时间:2018-06-20 10:12:02

标签: spring-boot exception-handling

我正在尝试在我的项目中实现CommonExceptionHandler类。我在Google上搜索过,有多种方法可以实现它。我发现的两个最常见的是一个。请帮助我,当我应该使用AccessDeniedHandler(接口)和ResponseEntityExceptionHandler(类)时。

当我在项目中启用安全配置时,它们有什么不同??

2 个答案:

答案 0 :(得分:1)

为清楚起见,ResponseEntityExceptionHandlerAccessDeniedHandler之间没有任何关系。第一个用于集中处理Spring MVC引发的最常见异常。它提供了大约17种受保护的方法,您可以重写这些方法以自定义异常后的响应。您可以找到更多详细信息here

用法示例:

@ControllerAdvice // or @RestControllerAdvice
public class CommonExceptionHandler extends ResponseEntityExceptionHandler {

}

关于doc上指示的第二个AccessDeniedHandlerHandles an access denied failure.当某人尝试访问她/他/他不允许的资源时,会引发拒绝访问异常访问它。

现在,如果您的问题是:您的CommonExceptionHandler还能处理AccessDeniedHandler异常吗?是的,这样做:

@ControllerAdvice // or @RestControllerAdvice
public class CommonExceptionHandler extends ResponseEntityExceptionHandler implements AccessDeniedHandler {

}

但是我建议您在另一个类中处理安全性异常:

public class CommonSecurityExceptionHandler implements AccessDeniedHandler {

}

答案 1 :(得分:0)

  

我正在尝试在我的项目中实现CommonExceptionHandler类。

最好使用

ResponseEntityExceptionHandler,因为它可以处理任何 sql javax验证 http方法和任何自定义异常。它使您能够使用状态代码自定义错误消息。 Here是如何配置自定义错误处理程序的示例。

根据文档, AccessDeniedHandler 只能处理类型为 AccessDeniedException 的异常。根据上面提到的链接,您可以通过遵循新方法来处理 AccessDeniedException

@ExceptionHandler(AccessDeniedHandler.class)
@ResponseStatus(value = HttpStatus.CONFLICT)
public Map<String, String> handleAccessDeninedException(AccessDeniedHandler ex) {
// write your own logic to return user friendly response 
}