feign拦截器

1,104 阅读2分钟

一、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调用请求都会被拦截,然后我们就可以再拦截方法中做具体的事情。