Feign&RestTemplate传递token

8 篇文章 0 订阅
5 篇文章 0 订阅

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;
    }
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于在Spring应用程序中进行HTTP调用的选项,FeignRestTemplate都是常见的选择。这两个库都可以用来实现客户端调用其他服务的功能,但它们有一些区别。 Feign是一个声明式的HTTP客户端,使用注解来定义和配置请求。它集成了Ribbon和Hystrix,可以与Eureka等服务注册中心和负载均衡器无缝配合使用。Feign简化了HTTP调用的配置和使用,使得编写客户端代码更加简洁和易读。 RestTemplate是Spring框架中的一个同步HTTP客户端,提供了丰富的API来进行HTTP请求和处理响应。它可以与其他Spring功能集成,如Spring MVC和Spring Boot。RestTemplate相对于Feign更加底层,更灵活,可以手动配置各种参数和拦截器。 选择使用哪个库取决于你的具体需求。如果你希望更简洁、更易于使用的API,并且与Spring Cloud的其他组件无缝集成,那么Feign是一个不错的选择。如果你需要更多的灵活性和自定义配置,并且不依赖于Spring Cloud的其他组件,那么RestTemplate可能更适合你。 另外,还要考虑到项目的现状和未来发展方向。如果你正在使用Spring Cloud或者计划将其引入到项目中,那么Feign可能更加符合整体架构。但如果你的项目已经使用了RestTemplate,并且没有特别需要引入Feign的理由,那么可以继续沿用RestTemplate。 总之,FeignRestTemplate都是可行的选择,具体取决于你的需求、技术栈和项目背景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值