我们可以先看一下为什么不能被捕获?

很明显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异常无法被全局异常捕获的解决办法的更多相关文章

  1. 腾讯TT浏览器应用程序发生异常(0xc0000409) 位置为0x027a1f7f 的解决办法

    2013年8月26日下午,腾讯TT浏览器 4.8版1000 出现“应用程序发生异常(0xc0000409)  位置为0x027a1f7f ”的错误,导致浏览器自动关闭. 无论重新卸载安装还是 清理系统 ...

  2. Android处理未捕获的异常(应用全局异常)

    public class CrashHandler implements UncaughtExceptionHandler { private static CrashHandler instance ...

  3. pl/sql oracle数据库中文数据显示异常或者不能使用中文查询的解决办法

    1首先我们需要找到pl/sql developer 目录 然后在该目录下 创建一个bat文件 在文件中定义 set NLS_LANG=AMERICAN_AMERICA.UTF8start PLSQLD ...

  4. Docekr 挂在卷之后访问目录时异常 cannot open directory '.': Permission denied 的解决办法

    1,原因,原因是CentOS7 中的安全模块 selinux 把权限禁掉了 2,解决办法如下 2.1,运行容器是加参数在 --privileged=true   (个人认为这是最佳方式,推荐使用) 如 ...

  5. vi 异常退出出现 E325:Attention的解决办法

    在linux系统下使用vi编辑程序的时候,没有保存退出,直接关闭了,出现了以下的情况: 打开就会显示filename.c.swap已经存在. 这是因为vi在编辑文件时会创建一个交换文件swap fil ...

  6. git 设置 .gitignore 为全局global + 配置.gitignore为全局后不生效解决办法

    outline 什么是 .gitignore 以及 .gitignore 的作用,这里不做赘述,自行网上查阅. 设置 .gitignore 为全局生效 懒得自己逐行敲忽略规则的话,建议移步:https ...

  7. springboot上传文件过大,全局异常捕获,客户端没有返回值

    最近在项目里进行全局异常处理时,上传文件超过配置大小,异常被捕获,但是接口直接报500错误,且没有任何返回值. 从后台报错日志来看,异常已经被全局异常处理捕获到了,并且也已经完成响应,为什么前端看不到 ...

  8. Net Core集成Exceptionless分布式日志功能以及全局异常过滤

    Net Core集成Exceptionless分布式日志功能以及全局异常过滤 相信很多朋友都看过我的上篇关于Exceptionless的简单入门教程[asp.Net Core免费开源分布式异常日志收集 ...

  9. 基于jeesite的cms系统(七):GlobalException全局异常和部署

    关于全局异常: 在业务代码中专注处理业务,而不是返回各种CodeMsg(比如这里只需要知道登录时成功还是失败,其余情况直接抛出异常),可以直接抛出异常,添加一个全局异常类,根据CodeMsg来生成异常 ...

  10. springmvc 全局异常解决方案

    系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手段减少运行时异常的发生. 系统的dao.service. ...

随机推荐

  1. 痞子衡嵌入式:利用i.MXRT1xxx系列ROM集成的DCD功能可轻松配置指定外设

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是利用i.MXRT1xxx系列ROM集成的DCD功能可轻松配置指定外设. 关于 i.MXRT1xxx 系列芯片 BootROM 中集成的 ...

  2. [Java SE]数组超界异常分析(IndexOutOfBoundsException/ArrayIndexOutOfBoundsException)

    import org.junit.Test; import java.util.ArrayList; /** * @author: Johnny * @date: 2021/11/12 11:17:2 ...

  3. sms-activate操作简便易上手且好用的接码工具【保姆级教程】

    前言 有些国外应用在使用应用上的功能时需要注册账号,由于某种不可抗因素,我们的手机号一般不支持注册,接收不到信息验证码,于是我们可以使用SmS-Activate提供的服务,使用$实现我们的需求(大概一 ...

  4. vulnhub靶场之DRIFTINGBLUES: 5

    准备: 攻击机:虚拟机kali.本机win10. 靶机:DriftingBlues: 5,下载地址:https://download.vulnhub.com/driftingblues/driftin ...

  5. 关键字——static

    static 关键字具有共享属性,放在方法区中

  6. JMeter-BeanShell预处理程序和BeanShell后置处理程序的应用

    一.什么是BeanShell? BeanShell是用Java写成的,一个小型的.免费的.可以下载的.嵌入式的Java源代码解释器,JMeter性能测试工具也充分接纳了BeanShell解释器,封装成 ...

  7. Redis(七)缓存穿透、缓存击穿、缓存雪崩以及分布式锁

    应用问题解决 1 缓存穿透 1.1 访问结构 正常情况下,服务器接收到浏览器发来的web服务请求,会先去访问redis缓存,如果缓存中存在数据则直接返回,否则会去查询数据库里面的数据,然后保存在red ...

  8. Java学习笔记07

    1. API ​ API(Application Programming Interface):应用程序接口. Java中的API ​ 指的是JDK中提供的各种功能的Java类,这些类将底层的实现封装 ...

  9. Prism Sample 16-RegionContext

    终于发现一个有趣的新知识了. 本例的核心是RegionContext,意思是一个区域的上下文.但与DataContext似乎并不相同. 先看一下整体思路. 在主窗体上只有一个Region: <G ...

  10. Hadoop运行集群搭建

    Hadoop运行集群搭建 虚拟机环境准备 安装虚拟机及基本配置 IP地址192.168.10.100.主机名称hadoop100,内存4G.硬盘50G 测试下虚拟机联网情况 1 [root@hadoo ...