springboot如何处理过滤器filter中抛出的异常
Posted 阿里-马云的学习笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot如何处理过滤器filter中抛出的异常相关的知识,希望对你有一定的参考价值。
在使用springboot过程中,一般都会设置全局异常管理,如下:
import com.yzf.enterprise.market.common.constant.HttpStatus; import com.yzf.enterprise.market.common.exception.BaseException; import com.yzf.enterprise.market.common.exception.CustomException; import com.yzf.enterprise.market.common.exception.DemoModeException; import com.yzf.enterprise.market.common.utils.StringUtils; import com.yzf.enterprise.market.framework.web.domain.AjaxResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.authentication.AccountExpiredException; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.validation.BindException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.NoHandlerFoundException; /** * 全局异常处理器 */ @RestControllerAdvice public class GlobalExceptionHandler { private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); /** * 基础异常 */ @ExceptionHandler(BaseException.class) public AjaxResult baseException(BaseException e) { return AjaxResult.error(e.getMessage()); } /** * 业务异常 */ @ExceptionHandler(CustomException.class) public AjaxResult businessException(CustomException e) { if (StringUtils.isNull(e.getCode())) { return AjaxResult.error(e.getMessage()); } return AjaxResult.error(e.getCode(), e.getMessage()); } @ExceptionHandler(NoHandlerFoundException.class) public AjaxResult handlerNoFoundException(Exception e) { log.error(e.getMessage(), e); return AjaxResult.error(HttpStatus.NOT_FOUND, "路径不存在,请检查路径是否正确"); } @ExceptionHandler(AccessDeniedException.class) public AjaxResult handleAuthorizationException(AccessDeniedException e) { log.error(e.getMessage()); return AjaxResult.error(HttpStatus.FORBIDDEN, "没有权限,请联系管理员授权"); } }
这样在系统报错的时候,就能将异常格式化输出到前端,对前端非常友好。但是过滤器中的异常通过这种方式是解决不了的,可以通过以下方式解决:
import org.springframework.boot.autoconfigure.web.ErrorProperties; import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController; import org.springframework.boot.web.servlet.error.DefaultErrorAttributes; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.util.Map; @RestController public class TokenErrorController extends BasicErrorController { public TokenErrorController() { super(new DefaultErrorAttributes(), new ErrorProperties()); } @Override @RequestMapping(produces = {MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) { Map<String, Object> body = getErrorAttributes(request, isIncludeStackTrace(request, MediaType.ALL)); HttpStatus status = getStatus(request); return new ResponseEntity((String) body.get("message"), status); } }
可以按照自定义的格式定义过滤器异常返回的数据格式。
以上是关于springboot如何处理过滤器filter中抛出的异常的主要内容,如果未能解决你的问题,请参考以下文章