欢迎来到代码驿站!

JAVA代码

当前位置:首页 > 软件编程 > JAVA代码

微服务如何通过feign.RequestInterceptor传递参数

时间:2022-09-02 09:12:44|栏目:JAVA代码|点击:

微服务通过feign.RequestInterceptor传递参数

Feign 支持请求拦截器,在发送请求前,可以对发送的模板进行操作,例如设置请求头等属性,自定请求拦截器需要实现 feign.RequestInterceptor 接口,该接口的方法 apply 有参数 template ,该参数类型为 RequestTemplate,我们可以根据实际情况对请求信息进行调整,示例如下:

创建自定义请求拦截器

在发送请求前增加了一个请求头信息,进行身份校验。

import feign.RequestInterceptor; 
import feign.RequestTemplate;      
public class MyRequestInterceptor implements RequestInterceptor{      
public void apply(RequestTemplatetemplate){ 
template.header("Authorization","123"); 
} 
}

服务端可以通过HttpServletRequest获取到前面传递的参数

具体获取逻辑如下

RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
if (requestAttributes != null) {
     HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
     request.getHeader("Authorization");
 }

feign的拦截器RequestInterceptor

SpringCloud的微服务使用Feign进行服务间调用的时候可以使用RequestInterceptor统一拦截请求来完成设置header等相关请求,但RequestInterceptor和ClientHttpRequestInterceptor有点不同,它拿不到原本的请求,所以要通过其他方法来获取原本的请求

首先创建自定义的RequestInterceptor

这里通过RequestContextHolder获取到当前的request

@Slf4j
@Component
public class MyFeignInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate template) {
        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
        log.info("===request: {}", template.url());
        template.header("aaaa", "bbbb");
    }
}

然后定义一个feign的接口类

@FeignClient(name = "SPRING-CLOUD-CLIENT-DEMO")
public interface ClientFeign {
    @GetMapping("/demo/get")
    String weight(@RequestParam String param);
}

再创建一个controller

@Slf4j
@RestController
@RequestMapping("/interceptor")
public class InterceptorController {
    @Autowired
    private ClientFeign clientFeign;
    @GetMapping("/feign")
    public String feign(@RequestParam String param) {
        return clientFeign.weight(param);
    }
}

运行程序测试一下接口

查看程序打印

可以看到进入了我们自定义的RequestInterceptor

INFO 25936 --- [ctor-http-nio-3] c.m.d.g.interceptor.MyFeignInterceptor   : ===request: /demo/weight?param=a

再查看feign调用的程序日志,可以看到设置的header信息

  INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController   : aaaa: a
  INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController   : websession: ECF4D97D02EEAFDDA3C15A7F1F050F61
  INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController   : header: aaaa, bbbb
  INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController   : header: accept, */*
  INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController   : header: user-agent, Java/1.8.0_191
  INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController   : header: host, 39.108.15.147:8801
  INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController   : header: connection, keep-alive

上一篇:SpringCloud学习笔记之Feign远程调用

栏    目:JAVA代码

下一篇:SpringBoot搭建多数据源的实现方法

本文标题:微服务如何通过feign.RequestInterceptor传递参数

本文地址:http://www.codeinn.net/misctech/212574.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有