springboot当controller抛出异常时,会重定向到error地址(BasicErrorController),然后重新进入所有的拦截器,包括ExceptionHandler,此时如果拦截器有异常,会无法捕捉到真正的业务异常
目前碰到的情况是这样的,我们定义了一个SessionFilter通过redis保存session,另有一个AuthInterceptorHandler处理登陆认证,一个
@ControllerAdvice
public class ExceptionController {
private final Logger logger= LoggerFactory.getLogger(ExceptionController.class);
@ExceptionHandler
public CommonReturnVO handleException(Exception e){
logger.error(e.getMessage(),e);
if(e instanceof ServiceException){
return CommonReturnVO.fail(e.getMessage());
}else if(e instanceof IllegalStateException) {
return CommonReturnVO.fail(e.getMessage());
}else {
return CommonReturnVO.fail("未知异常");
}
}
}
处理Exception
当controller抛出异常时,springboot重定向到error地址,然后重新进入SessionFilter和AuthInterceptorHandler,而此时AuthInterceptorHandler中获得的request并非为我们包装过的保存redis的request(这里为什么是springboot原生的request而不是我们包装过的暂未可知),权限拦截失效,返回前端登陆校验失败。
解决方法:
在AuthInterceptorHandler的excludeParttern中加上error即可。