如何在微服务之间调用时传递token

当我们在服务之进行相互调用时,由于后台服务是无状态的,因此,我们通常需要在服务之间相互调用时,在请求中携带token信息。至少可以用如下两种方式解决。

使用RestTemplate发送请求

我们需要配置一个ClientHttpRequestInterceptor,在restTempalte发送请求之前将当前请求中的Authorization添加到转发的请求头中

    @Bean
    public RestTemplate restTemplate() {
        RestTemplate template = new RestTemplate();
        template.setInterceptors(Collections.singletonList(headerInterceptor(null)));
        return template;
    }

    /**
     * 这个bean用于从当前请求中获取token信息,并将信息写入转发的请求头
     * 
     * @param value
     * @return
     */
    @Bean
    @Scope(value = "request", proxyMode = ScopedProxyMode.INTERFACES)
    public ClientHttpRequestInterceptor headerInterceptor(
            @Value("#{request.getHeader('Authorization')}") final String value) {
        return new ClientHttpRequestInterceptor() {
            @Override
            public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
                    throws IOException {
                request.getHeaders().add("Authorization", value);
                return execution.execute(request, body);
            }
        };

    }

使用Feign

创建一个RequestInterceptor,用于将向请求头写入Authorization。

以下是TokenHolder的定义

public interface TokenHolder {
    public String getValue();
}

以下是配置代码

    @Bean
    public RequestInterceptor feignConfig() {
        // 指定一个tokenHolder,用于存储token
        TokenHolder tokenHolder = tokenHolder(null);
        RequestInterceptor interceptor = new RequestInterceptor() {
            @Override
            public void apply(RequestTemplate template) {
                // 取出tokenHolder中存储的值
                template.header("Authorization", tokenHolder.getValue());
            }
        };
        return interceptor;
    }
    /**
     * 这个容器,用户从获取并保存当前请求头中的Authorization
     **/
    @Bean
    @Scope(value = "request", proxyMode = ScopedProxyMode.INTERFACES)
    public TokenHolder tokenHolder(
            @Value("#{request.getHeader('Authorization')}") String value) {
        return new TokenHolder() {
            @Override
            public String getValue() {
                return value;
            }
        };
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容