feign的全局拦截器和局部拦截器

拦截器和过滤器在java中用的最多的应该是处理一些head头,进行鉴权,签名等处理。feign也不例外。

一、feign全局拦截器

全局拦截器对每个feign客户端都生效

配置这里省略。

全局拦截器定义

package com.vvvtimes.interceptor;

import feign.RequestInterceptor;
import feign.RequestTemplate;

// 全局拦截器类
public class GlobalFeignRequestInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate template) {
        // 这里可以添加全局的请求头或其他公共参数
        System.out.println("调用全局拦截器");
    }


}

拦截器配置类

package com.vvvtimes.config;

import com.vvvtimes.interceptor.GlobalFeignRequestInterceptor;
import feign.RequestInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FeignGlobalInterceptorConfig {

    @Bean
    public RequestInterceptor globalInterceptor() {
        return new GlobalFeignRequestInterceptor();
    }

}

feign客户端配置

package com.vvvtimes.client;

import com.vvvtimes.config.FeignCustomInterceptorConfiguration;
import com.vvvtimes.interceptor.LocalFeignRequestInterceptor;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

//注意,只有取消全局的@Configuration注解才能使用局部拦截器配置
//如果全局和局部同时配置 先走局部拦截器,后走全局拦截器
//@FeignClient(name = "provider",configuration = LocalFeignRequestInterceptor.class)
//@FeignClient(name = "provider",configuration = FeignCustomInterceptorConfiguration.class)
@FeignClient(name = "provider")
public interface HelloClient {
    @GetMapping("/hello")
    String hello();
}

配置完成后,调用所有feign客户端的代码会先走apply方法里的逻辑,我们可以把签名逻辑放这里,所有feign服务如果签名一样还好,如果不一样,可以在feign客户端传入自定义请求头区分。不过最好还是使用局部拦截器

二、局部拦截器

如果之前写了全局拦截器,那么去掉@Configuration注解,否则会两个拦截器都执行一遍。

局部拦截器类定义

package com.vvvtimes.interceptor;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// 局部拦截器类
public class LocalFeignRequestInterceptor implements RequestInterceptor {
   @Override
    public void apply(RequestTemplate template) {
        // 这里可以添加特定于这个 Feign 客户端的请求头或其他参数
        System.out.println("调用局部拦截器");
    }


}

局部拦截器配置类

package com.vvvtimes.config;

import com.vvvtimes.interceptor.LocalFeignRequestInterceptor;
import feign.RequestInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

//@Configuration
public class FeignCustomInterceptorConfiguration {
   @Bean
    public RequestInterceptor localInterceptor() {
        return new LocalFeignRequestInterceptor();
    }
}

feign客户端配置

package com.vvvtimes.client;

import com.vvvtimes.config.FeignCustomInterceptorConfiguration;
import com.vvvtimes.interceptor.LocalFeignRequestInterceptor;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

//注意,只有取消全局的@Configuration注解才能使用局部拦截器配置
//如果全局和局部同时配置 先走局部拦截器,后走全局拦截器
//@FeignClient(name = "provider",configuration = LocalFeignRequestInterceptor.class)
@FeignClient(name = "provider",configuration = FeignCustomInterceptorConfiguration.class)
public interface HelloClient {
    @GetMapping("/hello")
    String hello();
}

这里的局部拦截器的FeignClient 可以指定拦截器配置类也可以指定为拦截器类。

三、同时使用全局拦截器和局部拦截器会有什么效果

经过验证,拦截器都会生效,先走局部拦截器,后走全局拦截器。

本文完整项目代码如下。

https://download.csdn.net/download/gsls200808/89807735

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值