微服务通过feign.RequestInterceptor传递参数
Feign 支持请求拦截器,在发送请求前,可以对发送的模板进行操作,例如设置请求头等属性,自定请求拦截器需要实现 feign.RequestInterceptor 接口,该接口的方法 apply 有参数 template ,该参数类型为 RequestTemplate,我们可以根据实际情况对请求信息进行调整,示例如下:
创建自定义请求拦截器
在发送请求前增加了一个请求头信息,进行身份校验。
1
2
3
4
5
6
7
|
import feign.RequestInterceptor; import feign.RequestTemplate; public class MyRequestInterceptor implements RequestInterceptor{ public void apply(RequestTemplatetemplate){ template.header( "Authorization" , "123" ); } } |
服务端可以通过HttpServletRequest获取到前面传递的参数
具体获取逻辑如下
1
2
3
4
5
|
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
1
2
3
4
5
6
7
8
9
10
|
@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的接口类
1
2
3
4
5
|
@FeignClient (name = "SPRING-CLOUD-CLIENT-DEMO" ) public interface ClientFeign { @GetMapping ( "/demo/get" ) String weight( @RequestParam String param); } |
再创建一个controller
1
2
3
4
5
6
7
8
9
10
11
|
@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
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/qq_32258777/article/details/102837238