spring cloud 非web请求feign调用header携带数据

首先,在之前的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中也没毛病

你可能感兴趣的:(spring,cloud)