【问题标题】:Spring filter throws custom exceptionSpring过滤器抛出自定义异常
【发布时间】:2017-04-20 14:58:57
【问题描述】:

我有一个控制器建议来处理我的应用程序抛出的所有验证异常,如下所示。

@RestControllerAdvice
public class RestApiExceptionController {

    @ExceptionHandler(ValidationErrorException.class)
    public ResponseEntity<?> appNotFoundException(ValidationErrorException exception) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
            .body(new ErrorResponse(exception.getErrorCode(), exception.getMessage())); 
    }
}

以我的方式,我想创建一个过滤器,对每个请求进行验证,并在必要时抛出自定义异常。但问题是我不能抛出自定义异常,如下所示。

public class ValidationFilter implements Filter {
    ...
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
        throw new ValidationErrorException(); // This is impossible
    }
    ...
}

在这种情况下如何抛出 ValidationErrorException 或者有其他更好的方法来处理此类任务。

【问题讨论】:

  • 是的,您可以...它必须是RuntimeExceptionServletException。这也与 Spring 无关,而是与通用 Servlet API(甚至通用 Java 编程)无关。

标签: java spring spring-mvc servlet-filters


【解决方案1】:

验证通常在请求对象上完成,这些请求对象通常在Controller 层中可用,之后它们是从请求格式到服务器处理格式的transformed。例如JSON 到 Java 对象。

因此,一旦通过完成整个filter 链接达到请求,就应该在Controller 层上执行或触发验证。

随后抛出的任何验证异常都可以在您的以下处理程序中处理,

@RestControllerAdvice
public class RestApiExceptionController {

    @ExceptionHandler(ValidationErrorException.class)
    public ResponseEntity<?> appNotFoundException(ValidationErrorException exception) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
            .body(new ErrorResponse(exception.getErrorCode(), exception.getMessage())); 
    }
}

filters的目的很是one

在客户端访问资源之前拦截来自客户端的请求 后端。

因此,实际的过滤器没有实际资源需要验证。一旦控件达到正确的component,它们就可用,在您的情况下,它是Controller

因此,更好的方法是不在filter 组件上进行任何基于resource 的验证。

【讨论】:

  • 你是对的。但是当我需要用户将加密的密码附加到 HTTP 标头并且我希望过滤器验证每个请求并在密码无效时抛出 ValidationErrorException 时怎么样?
  • @ChhornPonleu 这更多是设计决策。请寻找 Spring Security 模块。您在这里尝试根据请求进行授权/身份验证。它具有所有此类可用的安全相关功能。也因此抛出安全异常而不是验证异常。
  • 似乎 Spring Security 的功能比我需要的要多得多。这就是为什么我寻求这种非常简单的解决方案。
猜你喜欢
  • 2017-10-17
  • 1970-01-01
  • 2021-08-09
  • 2018-06-04
  • 2021-11-05
  • 2021-03-11
  • 2011-10-06
  • 2011-05-30
相关资源
最近更新 更多