RestTemplate传递Token
两种方法
exchange(),需要逐个修改
ChientHttpRequestInterceptor一个拦截器
1.exchange方法
旧的实现代码
UserDTO forObject = restTemplate.getForObject("http://rate-user-center/users/{id}",UserDTO.class,userId);
调用exchange
方法
//使用exchange传递token
String header = request.getHeader("X-Token");
HttpHeaders headers = new HttpHeaders();
headers.add("X-Token", header);
ResponseEntity<UserDTO> exchange = restTemplate.exchange(
"http://rate-user-center/users/{id}",
HttpMethod.GET,
new HttpEntity<>(headers),
UserDTO.class,
userId
);
return exchange.getBody();
这里从HTTPServletRequest中获取到一个header
从而获取到X-Token
接着,调用RestTemplate中的exchange方法,将token以HttpHeaders对象的方式传入,此时调用这个服务,就可以将token传入到下一个微服务了,很显然,这种方法也是需要逐个服务的请求去修改的。
2使用ClientHttpRequestInterceptor(拦截器的方法)
实现spring下的httpClient的ClientHttpRequestInterceptor
接口
//省略了包名
import org.apache.http.client.methods.HttpHead;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* @author frend
* @version v0.0.1
* @apiNote 全局的RestTemplate拦截器传递Token
* @time 2020/10/28 17:22
* @parjectName rate-content-center
*/
public class RestTemplateTokenRelayInterceptor implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
//获取Token
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes srat = (ServletRequestAttributes) requestAttributes;
HttpServletRequest formRequest = srat.getRequest();
String token = formRequest.getHeader("X-Token"); //获取header中的token
//获取到request中的header头
HttpHeaders headers = request.getHeaders();
//放入token
headers.add("X-Token", token);
return execution.execute(request, body);
}
}
拦截器实现好之后,需要在RestTemplate上做个全局配置
@Bean //将restTemplate纳入Spring管理,以方便后续使用的注入
@LoadBalanced //开启ribbon
public RestTemplate getRestTemplate() {
//配置一个RestTemplate的全局拦截器
RestTemplate restTemplate = new RestTemplate();
restTemplate.setInterceptors(
//给RestTemplate配置我们自己实现的拦截器
Collections.singletonList(
new RestTemplateTokenRelayInterceptor()
)
);
return restTemplate;
}
在创建RestTemplate的方法中,将我们实现的拦截器设置进去,就可以全局拦截了
到此,全局的RestTemplate传递就实现完成了。
最后做个总结:
同Feign中的两个方法一样,一个是需要逐个修改,一个作为全局拦截,在一些场景中,只有少量接口需要传递Token或者一些其他的header信息时,就可以使用exchange方法。
通过RestTemplate传递Token的内容就基本完成了,祝大家变得更强
网友评论