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
歡迎關注微信交流