美文网首页
微服务之间的Token传递之二@RestTemplate的tok

微服务之间的Token传递之二@RestTemplate的tok

作者: 青山有扶苏 | 来源:发表于2020-10-28 17:44 被阅读0次

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的内容就基本完成了,祝大家变得更强

相关文章

网友评论

      本文标题:微服务之间的Token传递之二@RestTemplate的tok

      本文链接:https://www.haomeiwen.com/subject/lbjcvktx.html