AuthenticationException异常无法被全局异常捕获的解决办法
我们可以先看一下为什么不能被捕获?

很明显JwtFilter的祖宗是Fliter,而我们自己定义的全局异常处理器@RestControllerAdvice
这个注解是 @ControllerAdvice 和 @ResponseBody的结合体。
主要是针对的我们controller控制器的。而过滤器是在这个之前进行处理的。我们在Filter里面进行抛出异常,那么该怎么做呢?
@RestControllerAdvice
public class GlobalExceptionHandler {
xxxxx
}
MyRealm域对象
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
//对传入的token进行类型转换
MyJsonWebToken myJsonWebToken = (MyJsonWebToken) authenticationToken;
String token = myJsonWebToken.getCredentials() + "";
//直接通过redis进行判断
RbacManagerDTO rbacManagerDTO = (RbacManagerDTO) redisTemplate.opsForValue().get(token);
if (null != rbacManagerDTO) {
return new SimpleAuthenticationInfo(token, token, "myRealm");
} else {
throw new AuthenticationException("token已过期,请重新登录");
}
}
Jwt验证步骤
@SneakyThrows
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
//检查认证请求,判断请求头中是否有token,有就执行登录验证
if (isLoginAttempt(request, response)) {
try {
//执行登录
executeLogin(request, response);
//全局异常无法捕获filter里的异常,这里就使用请求转发给controller,返回给前端
} catch (AuthenticationException e) {
response401(request, response, e.getMessage());
} catch (Exception e) {
//如果没有token,那么就请求转发到到401请求,让410controller返回前端一个请求
response401(request, response, "其他异常");
}
} else {
//没有token
response401(request, response, "没有token");
}
return true;
}
具体实现response401()方法
private void response401(ServletRequest request, ServletResponse response
, String msg) throws ServletException, IOException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
try {
// //请求转发401controller
httpServletRequest.getRequestDispatcher("/rbacManager/401/" + msg).forward(request, response);
} catch (ServletException | IOException e) {
e.printStackTrace();
}
}
401专属controller
@GetMapping("/401/{msg}")
public ResponseResult error (@PathVariable("msg") String msg){
return new ResponseResult(400,msg,null);
}
这样前台就可以收到我们的状态了。而我们的域对象的异常也算是成功返回给前端了。ヾ(✿゚▽゚)ノ
结果展示:

AuthenticationException异常无法被全局异常捕获的解决办法的更多相关文章
- 腾讯TT浏览器应用程序发生异常(0xc0000409) 位置为0x027a1f7f 的解决办法
2013年8月26日下午,腾讯TT浏览器 4.8版1000 出现“应用程序发生异常(0xc0000409) 位置为0x027a1f7f ”的错误,导致浏览器自动关闭. 无论重新卸载安装还是 清理系统 ...
- Android处理未捕获的异常(应用全局异常)
public class CrashHandler implements UncaughtExceptionHandler { private static CrashHandler instance ...
- pl/sql oracle数据库中文数据显示异常或者不能使用中文查询的解决办法
1首先我们需要找到pl/sql developer 目录 然后在该目录下 创建一个bat文件 在文件中定义 set NLS_LANG=AMERICAN_AMERICA.UTF8start PLSQLD ...
- Docekr 挂在卷之后访问目录时异常 cannot open directory '.': Permission denied 的解决办法
1,原因,原因是CentOS7 中的安全模块 selinux 把权限禁掉了 2,解决办法如下 2.1,运行容器是加参数在 --privileged=true (个人认为这是最佳方式,推荐使用) 如 ...
- vi 异常退出出现 E325:Attention的解决办法
在linux系统下使用vi编辑程序的时候,没有保存退出,直接关闭了,出现了以下的情况: 打开就会显示filename.c.swap已经存在. 这是因为vi在编辑文件时会创建一个交换文件swap fil ...
- git 设置 .gitignore 为全局global + 配置.gitignore为全局后不生效解决办法
outline 什么是 .gitignore 以及 .gitignore 的作用,这里不做赘述,自行网上查阅. 设置 .gitignore 为全局生效 懒得自己逐行敲忽略规则的话,建议移步:https ...
- springboot上传文件过大,全局异常捕获,客户端没有返回值
最近在项目里进行全局异常处理时,上传文件超过配置大小,异常被捕获,但是接口直接报500错误,且没有任何返回值. 从后台报错日志来看,异常已经被全局异常处理捕获到了,并且也已经完成响应,为什么前端看不到 ...
- Net Core集成Exceptionless分布式日志功能以及全局异常过滤
Net Core集成Exceptionless分布式日志功能以及全局异常过滤 相信很多朋友都看过我的上篇关于Exceptionless的简单入门教程[asp.Net Core免费开源分布式异常日志收集 ...
- 基于jeesite的cms系统(七):GlobalException全局异常和部署
关于全局异常: 在业务代码中专注处理业务,而不是返回各种CodeMsg(比如这里只需要知道登录时成功还是失败,其余情况直接抛出异常),可以直接抛出异常,添加一个全局异常类,根据CodeMsg来生成异常 ...
- springmvc 全局异常解决方案
系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手段减少运行时异常的发生. 系统的dao.service. ...
随机推荐
- 详解 APISIX Lua 动态调试插件 inspect
作者罗锦华,API7.ai 技术专家/技术工程师,开源项目 pgcat,lua-resty-ffi,lua-resty-inspect 的作者. 原文链接 为什么需要 Lua 动态调试插件? Apac ...
- DFS手写排列
DFS手写排列 虽然python中有自带的排列函数,但是在某些特殊情况需要手写排列.掌握了DFS手写排列对DFS的理解有一定的帮助. 1.手写排列(非字典序输出) 这种代码比较简单易懂,但是不是按照字 ...
- 通过重构来加深理解——DDD
上部分模型驱动设计的构造块为维护模型和实现之间的关系打下了基础.在开发过程中使用一系列成熟的基本构造块并运用一致的语言,能够使开发工作更加清晰而有条理. 我们面临的真正挑战是找到深层次的模型,这个模型 ...
- [C++核心编程] 3、函数提高
文章目录 3 函数提高 3.1 函数默认参数 3.2 函数占位参数 3.3 函数重载 3.3.1 函数重载概述 3.3.2 函数重载注意事项 3 函数提高 3.1 函数默认参数 在C++中,函数的形参 ...
- 实例化对象 A a = new A();
"new" 在Java中代表实例化的意思, A a = new A()代表实例化了一个对象a, 这个对象a属于A类. 可以认为A是一个抽象概念, 对象a是一个实体(存储于内存), ...
- 2020-11-24:n个物品每个物品都有一定价值,分给2个人,怎么分两个人的价值差最小?
福哥答案2020-11-24: 背包问题:背包容量是SUM/2. 每个物体的体积是数的大小,然后尽可能的装满背包. golang代码如下: package main import ( "fm ...
- 2021-04-08:给定一个单链表的头节点head,请判断该链表是否为回文结构。
2021-04-08:给定一个单链表的头节点head,请判断该链表是否为回文结构. 福大大 答案2021-04-08: 1.找中点. 2.按中点切分成两个链表. 3.反转右边链表. 4.相等判断. 5 ...
- 2021-11-21:map[i][j] == 0,代表(i,j)是海洋,渡过的话代价是2, map[i][j] == 1,代表(i,j)是陆地,渡过的话代价是1, map[i][j] == 2,代表
2021-11-21:map[i][j] == 0,代表(i,j)是海洋,渡过的话代价是2, map[i][j] == 1,代表(i,j)是陆地,渡过的话代价是1, map[i][j] == 2,代表 ...
- Netty自定义协议要素
魔数:用来判断是否是无效数据包 协议版本号:可以支持协议的升级 序列化算法:消息正文使用哪种序列化方式,可以扩展.例如:protobuf,json,hessian等 指令类型:跟业务相关,例如:登录, ...
- MongoDB + SpringBoot 的基础CRUD、聚合查询
1.数据准备 1.1.springboot导包 springboot版本:2.7.10 点击查看代码 <!--mongodb的包--> <dependency> <gro ...