文章目錄
- 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; }