天天看点

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