Spring Boot微服务间如何通过RestTemplate传递JWT Token?
在Posts服务中通过RestTemplate向Media服务传递Token的解决方案
方法1:手动在请求中添加Token请求头
直接从当前请求上下文提取Token,构建请求头后发起调用,适合单次或少量调用场景:
// 从当前请求中获取Authorization头的Token String token = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()) .getRequest() .getHeader("Authorization"); // 构建携带Token的请求头 HttpHeaders headers = new HttpHeaders(); if (token != null) { headers.set("Authorization", token); } HttpEntity<Void> requestEntity = new HttpEntity<>(headers); // 调用Media服务接口 ResponseEntity<MediaResponse> response = restTemplate.exchange( "http://media-service/api/media", HttpMethod.GET, requestEntity, MediaResponse.class );
方法2:自定义拦截器实现Token自动传递
如果Posts服务多处需要调用Media服务,推荐用拦截器统一处理Token传递,避免重复代码:
- 实现
ClientHttpRequestInterceptor接口:
public class TokenRelayInterceptor implements ClientHttpRequestInterceptor { @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { // 从当前请求上下文提取Token ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if (attributes != null) { String token = attributes.getRequest().getHeader("Authorization"); if (token != null) { request.getHeaders().set("Authorization", token); } } return execution.execute(request, body); } }
- 配置RestTemplate时注入拦截器:
@Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); restTemplate.getInterceptors().add(new TokenRelayInterceptor()); return restTemplate; } }
之后所有通过该RestTemplate发起的请求,都会自动携带当前请求的Token。
关键注意点
- 异步调用场景下,
RequestContextHolder默认无法获取请求上下文,需要手动通过RequestContextHolder.setRequestAttributes()传递上下文。 - 如果Token存储在其他请求头(如
X-Auth-Token),需同步修改代码中的头名称。 - 要添加空值判断,避免因Token不存在导致空指针异常。
内容的提问来源于stack exchange,提问作者Akheel Pasha
相关产品推荐
相关产品推荐

