首先,在之前的spring cloud nacos feign服务调用携带jwtToken_K_Men的博客-CSDN博客_feign nacos博文中我们介绍了feign调用携带token的解决放法,但是那仅适用于前端发起请求从controller层进入service层产生微服务之间的调用问题。实际开发场景中我们可能遇到很多非web请求,比如定时任务等
在之前的基础上我们继续编程,直接上代码
@Configuration
public class FeignConfig implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
// 获取当前请求
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
// 获取request
if (null == attributes) {
//非web请求feign调用手动设置内部系统来源不校验token但需要校验来源@InnerApi
requestTemplate.header(Constant.SYSTEM_SOURCE, SystemSourceEnum.LMS.getCode());
}else {
HttpServletRequest request = attributes.getRequest();
// 获取Header中的tokenValue
String token = request.getHeader("Authorization");
//这里转换一下可能postman请求过来的会有"Bearer "
String jwtToken = token.replace("Bearer ", "");
// 注入Feign的请求中,这里header中token的key需要和被调用方一致
requestTemplate.header("Authorization", jwtToken);
}
}
我的场景主要是定时任务,当定时任务发起调用时,attributes会是null,所以当非web请求进来时我们手动添加header一个系统来源的标识,并且在被调用方的controller中加入自定义注解@InnerApi,用于拦截器中进行校验,此时则不进行token校验并且需要对系统来源进行验证,当然我们可以给这个header中的数据进行加密,被调用方拦截器中解密,这样不担心被外部进行恶意攻击。当然非要进行验证也是可以的,token存放于redis中然后在获取放进header中也没毛病