如何在微服务之间调用时传递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;
}
};
}