欢迎光临散文网 会员登陆 & 注册

Shiro集成JWT过滤器异常无法捕捉

2023-03-20 11:21 作者:筱贲_  | 我要投稿

因为SpringBoot也是刚刚开始自学,差不多学个几个小时,放下个好几天,一直学的磕磕绊绊的,

在shiro集成jwt时发现jwt抛出的异常,全局异常处理器无法捕捉,因为请求会按照 filter -> interceptor -> controllerAdvice -> aspect -> controller的顺序调用

所以RestControllerAdvice无法捕获到过滤器的异常,

在网上找了好多的方式,大致有以下几种

1.转发方式

大致是在JWTFilter 新增responseError方法,修改executeLogin方法,在过滤器中捕获到异常时,httpServletResponse.sendRedirect 使用重定向到一个我们自定义的处理过滤器错误的一个controller中,返回自定义格式的对象到前端。

2.修改ErrorController 

新建一个ErrorControllerImpl 实现ErrorControllerErrorPath 指向error 再写一个方法把Error抛出 然后Controller全局统一异常处理RestControllerAdvice就能捕获到异常了


这两种方式都可以实现,但是我只想简单的抛出一个异常而已,而且这两种方式只能返回错误,无法返回自定义状态码,想要返回自定义状态码,需要自行写逻辑判断,有点懒,就没用这种方式,本来想放弃了,就这样吧,这两种方式麻烦一点,但也不是不能用,然后我突然发现,在shiro自定义的RealmdoGetAuthenticationInfo方法中抛出的异常都无法捕捉了,我忍,因为缕了一下执行过程后,发现执行doGetAuthenticationInfo的时候,还是在过滤器那里,所以也捕捉不到异常,然后我在过滤器中使用Autowired自动注入了AdminService,在过滤器中查询用户信息,在按照上面两种方式抛出异常不就可以了,结果报了空指针异常,研究半天,想着自动注入不可行,那么使用ApplicationContextgetBean方式来获取呢,结果可行,那么也可以使用使用这种方式来获取handlerExceptionResolver,通过handlerExceptionResolverresolveException来抛出异常啊,这样也不用转发或者修改ErrorController

在启动文件同级的地方建立一个SpringContext


SpringContext

然后再过滤器中使用handlerExceptionResolver.resolveException来抛出异常



Shiro集成JWT过滤器异常无法捕捉的评论 (共 条)

分享到微博请遵守国家法律