异常处理器与拦截器 深入探究 --拦截器状态码无法被识别

简介: 异常处理器与拦截器 深入探究 --拦截器状态码无法被识别

异常处理器与拦截器 深入探究 --拦截器状态码无法被识别


首先来阐述前景提要 我先是做了一个什么拦截器


下面是引用回我之前做过的思维导图 以及拦截器的实现

拦截器


那么前面发生了什么问题呢?


首先客户端的每一个请求都需要经过两个拦截器 然后报错的话直接返回

Java
@Slf4j
@RestControllerAdvice
public class WebExceptionAdvice {

@ExceptionHandler(RuntimeException.class)
public Result handleRuntimeException(RuntimeException e) {
log.error(e.toString(), e);
return Result.fail(“服务器异常”);
}
}

报错就直接报服务器异常了 虽然在拦截器2中也有设置状态码

Java
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//1.判断是否需要拦截(ThreadLocal中是否有用户)
if (UserHolder.getUser() == null&&ListenerHolder.getListener()==null) {
response.setStatus(10002);
System.out.println(“拦截器报错啦!!!”);
response.getHeader(“erro”);
return false;
}

return true;
}
}

但实际上 在支付宝小程序中这里的状态码却无法被识别 这是一个极其奇怪的事情 在前端看到的状态码是不一样的


后面发现在定义fail的时候就把外层的状态码给定死为了200!这是个极其不好的点 设计的时候贪图方便没有管他 导致了后面 实际发生异常跟没有登录的报错没办法区分开 于是 我做了以下的改进


首先是重写了 报错体系

Java
@Slf4j
@RestControllerAdvice
public class WebExceptionAdvice {
@ExceptionHandler(RuntimeException.class)
public ResponseEntity handleRuntimeException(HttpServletRequest request, RuntimeException e) {
log.error(e.toString(), e);
Result result = Result.fail(“服务器异常”);
HttpStatus status = HttpStatus.INTERNAL_SERVER_ERROR;
if (e instanceof UnAuthorException) {
//这个是拦截器报错才设置的状态码
status = HttpStatus.UNAUTHORIZED;
}
ResponseEntity resultResponseEntity = new ResponseEntity<>(result, status);
log.error(resultResponseEntity.toString());
return resultResponseEntity;
}
}

自己定义了一个特殊的错误类型 用到RuntimeException 下面是他的定义

Java
public class UnAuthorException extends RuntimeException {
public UnAuthorException(String message) {
super(message);
}
}//非常简单_

然后在合适的地方抛出他 当然是在拦截器中 表示用户未登录的时候 抛出这个自定义异常UnAuthorException

Java
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//1.判断是否需要拦截(ThreadLocal中是否有用户)
if (UserHolder.getUser() == null&&ListenerHolder.getListener()==null) {
System.out.println(“拦截器报错啦!!!”);
//response.getHeader(“erro”);
throw new UnAuthorException(“用户未登录”);
}
return true;
}
}

后面反思了一下为什么没被识别到状态码 因为在定义Result对象的时候 对于fail方法并没有重新定义他的状态码 这是个很大的问题 在下一个项目中不应该出现 应该提前定义好

相关文章
|
JSON 前端开发 Java
springmvc-JSR303进行服务端校验&分组验证&SpringMVC定义Restfull接口&异常处理流程&RestController异常处理
springmvc-JSR303进行服务端校验&分组验证&SpringMVC定义Restfull接口&异常处理流程&RestController异常处理
|
23天前
|
前端开发 Java UED
SpringMVC全局异常处理+拦截器使用+参数校验
通过使用 SpringMVC 的全局异常处理、拦截器和参数校验,可以有效提升 Web 应用程序的安全性、稳定性和用户体验。这些技术的合理应用,不仅可以保证代码的健壮性,还能提高代码的可维护性,为开发高质量的 Web 应用程序提供了坚实的基础。
34 6
|
7月前
17_异常拦截器
17_异常拦截器
128 0
|
7月前
|
中间件
16_响应拦截器
16_响应拦截器
45 0
|
7月前
Feign的异常过滤器
Feign的异常过滤器
|
7月前
|
前端开发
Nestjs(五)异常处理方式(异常过滤器)
Nestjs(五)异常处理方式(异常过滤器)
138 0
|
Java 容器
过滤器和拦截器的区别
Filter 也称为过滤器,基于Servlet实现,拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行,基于AOP思想,对方法进行增强。和servlet 中的过滤器类似,都是对用户请求进行处理。
84 0
|
JSON 前端开发 数据格式
2021-08-13service层校验异常处理器,拦截器,json转换器
2021-08-13service层校验异常处理器,拦截器,json转换器
53 0
|
存储 前端开发 安全
前端401错误 & 解决方法:响应拦截器
前端401错误 & 解决方法:响应拦截器
前端401错误 & 解决方法:响应拦截器
|
架构师 Java Spring
聊聊面试中的过滤器与拦截器
聊聊面试中的过滤器与拦截器
204 1
聊聊面试中的过滤器与拦截器