在微服务的概念中我们经常会通过一个入口去调用A,然后A去请求B,B去请求C这个时候我们会发现从A服务接收到请求去调用B时会遇到token丢失的情况,如果是把token里的数据解析出来再去进行传递明显不合理,也会增加接口的参数个数,那我们怎么保证通过feign调用时不丢失掉token或者其他重要请求参数呢?这里会用到一个非常重要的类 RequestInterceptor 这个是feign包里提供的一个发送请求的拦截器,实现这个类重写apply方法我们可以定制一些模板参数,可以理解为每次发送请求时固定携带的参数。下面上代码。这里的代码时模拟传递Authorization参数的情况,如果有其他参数需要传递加上即可。

@Component
public class FeignInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate template) {
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        if (requestAttributes != null) {
            HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
            if (request != null) {
                Enumeration<String> headerNames = request.getHeaderNames();
                while (headerNames.hasMoreElements()) {
                    String headerName = headerNames.nextElement();
                    if (headerName.equalsIgnoreCase("Authorization")) {
                        String token = request.getHeader(headerName);
                        //传递令牌
                        template.header(headerName, token);
                    }
                }
            }
        }
    }
}
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐