天天看點

Feign&RestTemplate傳遞tokenFeign傳遞TokenRestTemplate傳遞Token

文章目錄

  • 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;
    }