先说原理:
springMVC的工作流程中,前端所有的访问路径都会统一的进入到DispatcherServlet 中,DispatcherServlet 会拿着前端的url去处理器映射器 (HandlerMapping)找url与方法(类)的映射关系。通过映射关系确定那个类中的那个方法。
根据这一流程,我们可以借此改造
改造流程:
增加一个注解
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface IgnoreAuth {
}
修改JwtFilter(org/jeecg/config/shiro/filters/JwtFilter.java)中的isAccessAllowed方法
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
try {
// lizhihui-insert date:2022/9/3 for:增加通过注解方式忽略登录校验
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
RequestMappingHandlerMapping mapping = SpringContextUtils.getBean(RequestMappingHandlerMapping.class);
//根据request获取到具体方法
HandlerExecutionChain handler = mapping.getHandler(httpServletRequest);
if(handler != null && handler.getHandler() instanceof HandlerMethod){
HandlerMethod handlerMethod = (HandlerMethod) handler.getHandler();
//判断方法上是否有注解
IgnoreAuth methodAnnotation = handlerMethod.getMethodAnnotation(IgnoreAuth.class);
if(methodAnnotation != null){
return true;
}
//判断类上是否有注解
IgnoreAuth typeAnnotation = handlerMethod.getBeanType().getAnnotation(IgnoreAuth.class);
if (typeAnnotation != null) {
return true;
}
}
// lizhihui-insert-end date:2022/9/3 for:增加通过注解方式忽略登录校验
executeLogin(request, response);
return true;
} catch (Exception e) {
JwtUtil.responseError(response,401,CommonConstant.TOKEN_IS_INVALID_MSG);
return false;
//throw new AuthenticationException("Token失效,请重新登录", e);
}
}
完成配置
只需在需要过滤的方法或类上加上@IgnoreAuth 即可
DEBUG注意点:
Mapping是前端URL与方法的映射关系
当前URL下的方法名称