Spring Security捕获filter层面异常

2,144 阅读1分钟

通常,我们通过@ControllerAdvice和@ExceptionHandler来捕获并处理Controller层面的异常。但是,filter是在controller层之前的,需要先通过filter才能到达controller层,此文就介绍一下如何捕获filter层面的异常。

spring的异常会转发到BasicErrorController中进行异常写入,然后才会返回客户端。所以,我们可以在BasicErrorController对filter异常进行捕获并处理。

所以,我们需要重写BasicErrorController中的error方法。

@RestController
public class ErrorController extends BasicErrorController {

    public ErrorController(ServerProperties serverProperties) {
        super(new DefaultErrorAttributes(), serverProperties.getError());
    }

    @Override
    @RequestMapping(produces = {MediaType.APPLICATION_JSON_VALUE})
    public ResponseEntity error(HttpServletRequest request) {
        Map<String, Object> body = getErrorAttributes(request, isIncludeStackTrace(request, MediaType.ALL));
        //可以通过断点调试来查看body中的信息
        HttpStatus status = getStatus(request);
        ResultModel result = new ResultModel();
        result.setStatus(status.value());
        return new ResponseEntity<>(result,status);
    }
}

此处,resultModel是我自定义的一个通用返回器,如果用ResponseEntity直接返回也是可以的。自定义通用返回器可以配合SpringMVC的配置来更正确地实现。