一、背景
系统定义了全局统一异常处理,使用了@RestControllerAdvice注解的方式。
鉴权使用的是JWT,使用filter对token进行解析和验证。然后突然发现一个问题,就是当token过期时,抛出的异常无法通过全局统一异常处理对外返回,而是返回500。
二、原因
全局统一异常处理只能处理控制器中发生的异常。要在Spring Security过滤器链中重用此功能,需要定义过滤器并将其挂钩到安全配置中。过滤器需要将异常重定向到统一异常处理中。
三、代码
在filter中注入HandlerExceptionResolver
然后在catch中抛出
之后在GlobalExceptionHandlerAdvice中定义需要处理的异常类型,本文中用的是JwtException
这时便可以跟在业务代码里面抛出的业务异常一样处理了。