Feign拦截器和SpringMvc拦截器的区别
SpringMvc的拦截器:
Feign的拦截器:
实现代码
实现拦截器这里需要实现 feign包下提供的一个接口RequestInterceptor,并实现apply方法
你的拦截逻辑都可以写在apply这个方法中
@Component
public class MyFeignInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
// 拦截逻辑 。。。
}
}
你可以在里面打印一些日志、也可以设置这个新请求的header、query、uri等信息
通常情况下我们会在拦截器的header里面增加一些认证信息
@Component
public class MyFeignInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
/**
* 获取当前线程的 servletRequestAttributes 对象(是一个ThreadLocal对象,因此是线程隔离的)
* 如果 你是异步线程调用feign接口,那么你获得的servletRequestAttributes对象默认是null的
* 可以在开启异步线程前加上如下代码,设置requestAttributes对象可以在父子线程间共享 默认情况下,SpringMvc中requestAttributes是不能在父子线程中共享的
* RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(), true);
*/
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
// 获取当前线程 老请求的httpServletRequest
HttpServletRequest httpServletRequest = servletRequestAttributes.getRequest();
if(httpServletRequest != null) {
// 从老请求的request对象中拿到header中的authorization信息
String authorization = httpServletRequest.getHeader("authorization");
// 为requestTemplate这个新的请求对象 传递 用户信息请求头
requestTemplate.header("Authorization", authorization);
}
}
}
然后可以手动生成该类的bean对象 注入到spring容器中(其实上面的类已经加上@Component注解了,不手动加应该也没问题)
@Configuration
public class FeignAutoConfiguration
{
@Bean
public RequestInterceptor requestInterceptor()
{
return new FeignRequestInterceptor();
}
}