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

2019-01-10  本文已影响0人  虾游于海

当我们在服务之进行相互调用时,由于后台服务是无状态的,因此,我们通常需要在服务之间相互调用时,在请求中携带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;
            }
        };
    }
上一篇 下一篇

猜你喜欢

热点阅读