文章目录
- Feign传递Token
- RestTemplate传递Token
Feign传递Token
- @RequestHeader注解
1.在api接口参数处写上@RequestHeader注解旨接受来自前端的Header里的token 2.在feignclient接口处加上@RequestHeader注解旨在将token写在头部放行到指定服务 缺点:如果要让接口都加@RequestHeader很麻烦
- RequestInterceptor(推荐)
1.代码 public class TokenRelayRequestInteceptor implements RequestInterceptor { @Override public void apply(RequestTemplate requestTemplate) { // 1.获取token RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); ServletRequestAttributes attributes = (ServletRequestAttributes) requestAttributes; HttpServletRequest request = attributes.getRequest(); String token = request.getHeader("X-Token"); if (StringUtils.isEmpty(token)) { // 2.将token传递 requestTemplate.header("X-Token", token); } } } 2.写全局配置也可以在fegin接口上写configuration指定该类 feign: client: config: #全局配置 default: loggerLevel: full requestInterceptors: - com.ray.content_center.interceptor.TokenRelayRequestInteceptor
RestTemplate传递Token
- exchange()
@GetMapping("/tokenRelay/{userId}") public ResponseEntity<UserDTO> TokenRelay(@PathVariable Integer userId, HttpServletRequest request) { String token = request.getHeader("X-Token"); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.add("X-Token", token); return restTemplate.exchange( "http://user-center/users/{userId}", HttpMethod.GET, new HttpEntity<>(httpHeaders), UserDTO.class, userId ); }
- 实现ClientHttpRequestInterceptor(推荐)
1.代码 public class TestRestTemplateTokenRelayInterceptor implements ClientHttpRequestInterceptor { @Override public ClientHttpResponse intercept(HttpRequest httpRequest, byte[] bytes, ClientHttpRequestExecution clientHttpRequestExecution) throws IOException { // 1.获取token RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); ServletRequestAttributes attributes = (ServletRequestAttributes) requestAttributes; HttpServletRequest request = attributes.getRequest(); String token = request.getHeader("X-Token"); // HttpHeaders headers = httpRequest.getHeaders(); headers.add("X-Token", token); // 保证请求继续执行 return clientHttpRequestExecution.execute(httpRequest, bytes); } } 2.写配置 @Bean @LoadBalanced @SentinelRestTemplate public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); restTemplate.setInterceptors( Collections.singletonList( new TestRestTemplateTokenRelayInterceptor() ) ); return restTemplate; }