一、feign简介
1. 什么是feign?
Feign是一个声明式Web Service客户端,使得编写Web Service客户端变得非常容易,只需要创建一个接口,然后在上面添加注解即可。
Spring cloud整合了feign,常与注册中心组件结合使用;实现微服务之间的调用。
2. 什么是feign拦截器?
顾名思义,feign拦截器就是在使用feign调用服务的时候所拦截调用请求的一种拦截器。
3. feign拦截器的作用
当服务配置了授权认证时,再进行资源微服务之间的调用就需要访问令牌,而两个微服务之间的调用时没有传递头文件的(因为token时存在放客户端的,只有从客户端发起的请求才会携带由token令牌),所以再进行微服务之间的调用时就需要手动为调用请求添加token,只有携带正确的token才能完成访问。
所以feign拦截器的作用就是拦截使用feign进行的微服务之间的调用请求,手动给请求添加token令牌。
二、feign拦截器的使用
1. 导入spring 整合feign依赖
自行导入
2. 启动类上开启feign的使用
添加注解:@EnableFeignClients
3. 定义feign接口
调用哪个微服务就配置哪个服务的接口。
以上三步都是关于feign的使用。
4. 定义feign拦截器
关于feign拦截器的使用需要实现RequestInterceptor
接口,并实现其中的方法。
@Component
public class FeignInterceptor implements RequestInterceptor {
/**
* 拦截方法,再此方法中完成请求头的封装。
*/
@Override
public void apply(RequestTemplate requestTemplate) {
//传递令牌
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); // 获取请求头参数
if (requestAttributes != null){
HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
if (request != null){
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()){
String headerName = headerNames.nextElement();
if ("authorization".equals(headerName)){
String headerValue = request.getHeader(headerName); // Bearer jwt
//传递令牌
requestTemplate.header(headerName,headerValue);
}
}
}
}
}
}
当定义了feign拦截器后,所有的feign调用请求都会被拦截,然后我们就可以再拦截方法中做具体的事情。