springboot 全局捕捉filter中的异常

svbadmin学习日志

本学习日志是使用Springboot和Vue来搭建的后台管理系统:
演示地址:http://118.31.68.110:8081/index.html
账号:root
密码:123
所有代码可以在gitbub上找到,切换到相应分支即可。【代码传送门】

正篇

第一节 spring boot 模块化构建项目
第二节 整合mybatisplus完成用户增删改查
第三节 整合springsecurity实现基于RBAC的用户登录
第四节 springsecurity结合jwt实现前后端分离开发
第五节 使用ResponseBodyAdvice格式化接口输出
第六节 springboot结合redis实现缓存策略
第七节 springboot结合rabbitmq实现队列消息
第八节 springboot结合rabbitmq实现异步邮件发送
第九节 利用springboot的aop实现行为日志管理
第十节 利用Quartz实现数据库定时备份
第十一节 springboot配置log输出到本地文件
第十二节 使用flyway对数据库进行版本管理
第十三节 springboot配合VbenAdmin实现前端登录
第十四节 springboot配合VbenAdmin实现用户CURD
第十五节 基于RBAC的权限管理VbenAdmin前端实现
第十六节 springboot 打包vue代码实现前后端统一部署

番外

2.1 数据库设计原则
3.1 配置apifox自动获取登录的token
13.1 springboot 全局捕捉filter中的异常
14.1 springsecurity整合mybatisplus出现isEnable的问题和解决方案


前言

第十三节实现登录后,今天我再次刷新页面,发现后台报错了。因为token过期了,而filter层抛出的异常没有被全局异常捕获。
springboot 全局捕捉filter中的异常_第1张图片

解决

从网上的资料来看,文章末尾有部分文章连接,解决这个问题的方法大概有3类:

  1. 继承BasicErrorController,基本不推荐
  2. 定义一个ExceptionFilter,捕获所有filter的异常,然后定义一个FilterExceptionHandler,接受ExceptionFilter抛出的异常,最后使用FilterRegistrationBean注册ExceptionFilter,异常需要抛两次,试了下没成功
  3. 使用HandlerExceptionResolver来抛异常,推荐可行
    /** 在Filter中注入HandlerExceptionResolver **/
    @Autowired
    @Qualifier("handlerExceptionResolver")
    private HandlerExceptionResolver resolver;

...

    System.out.println("令牌已失效");
    resolver.resolveException(request, response, null, new BadCredentialsException(ErrorCode.TOKEN_INVALID.getMessage()));
    return;

    @ExceptionHandler(BadCredentialsException.class)
    @ResponseStatus(HttpStatus.UNAUTHORIZED)
    public ResultFormat<String> badCredentialsException(Exception e) {
        log.error("认证异常 ex={}", e.getMessage(), e);
        return ResultFormat.fail(ErrorCode.LOGIN_FAILED.getCode(),e.getMessage());
    }

参考文档:
【Java】SpringBoot 全局异常捕获不到Filter中的异常的解决办法
springboot 处理 filter 中抛出的异常
花式玩 Spring Boot!过滤器竟有 N 种注册方式!松哥手把手教你
关于springboot中filter中使用全局异常处理说明
SpringBoot中如何处理Filter抛出的异常
SpringBoot捕获AccessDeniedException

你可能感兴趣的:(svbadmin,spring,boot,java,java-rabbitmq)