跳到主要内容

【12】Feign请求拦截器RequestInterceptor源码分析及使用案例

文章目录

  • 需求场景
  • 解决方案
  • 源码分析
  • FeignClient 注解中配置请求拦截器

需求场景

在使用Spring Security Oauth2时,通过消息头中的Authorization Bearer toeknXXXX对令牌进行校验,如果失败,是会拒绝访问的。

那么在使用Feign进行调用时,就会出现问题,因为Feign发送请求时,是没有传递认证消息头的。

解决方案

实现RequestInterceptor,获取原本请求中的认证消息头,然后添加到请求模板中。

@Component
public class Oauth2TokenRequestInterceptor implements RequestInterceptor {



@Override
public void apply(RequestTemplate requestTemplate) {


// 获取请求中的消息头
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
String requestHeader = request.getHeader(HttpHeaders.AUTHORIZATION);
if (StringUtils.isNotBlank(requestHeader) && requestHeader.startsWith("Bearer ")) {


// 将消息头塞入到请求模板中
requestTemplate.header(HttpHeaders.AUTHORIZATION, requestHeader);
}
}
}

测试,可以看到Feign请求成功传递了消息头。