源码原理

feign调用时使用RequestInterceptor设置re

2020-05-08  本文已影响0人  小胖学编程

在SpringCloud微服务中,可以使用feign组件来完成服务调用。但是有时需要设置request对象。那么需要实现RequestInterceptor接口来完成我们的需求。

对应接口:

//可以配置零个或多个RequestInterceptor,以便可以为所有请求添加请求头。对于拦截器调用的顺序,没有给出任何的保证。
public interface RequestInterceptor {

  /**
   * Called for every request. Add data using methods on the supplied {@link RequestTemplate}.
   */
  void apply(RequestTemplate template);
}

自定义实现:

@Configuration
public class FeignConfig implements RequestInterceptor {

    protected final Logger logger = LoggerFactory.getLogger(this.getClass());


    @Override
    public void apply(RequestTemplate requestTemplate) {
        //获取到进入时的request对象
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (null != attributes) {
            HttpServletRequest request = attributes.getRequest();
            //获取到请求头名字
            Enumeration<String> headerNames = request.getHeaderNames();
            while (headerNames.hasMoreElements()) {
                String name = headerNames.nextElement();
                 //获取到请求头
                String value = request.getHeader(name);
                //经过处理逻辑后
                //使用进入的request对象来设置Feign请求对象的请求头
                requestTemplate.header(name, value);
            }
           //获取进入线程的Cookie信息(获取token信息)
            String token = CookieUtil.getCookie(request, "token");
           //设置Cookie字段
            requestTemplate.header("Cookie", "token=" + token);
    }
}

工具类:

public class CookieUtil {
    private static Logger logger= LoggerFactory.getLogger(CookieUtil.class);
    public static void writeCookie(HttpServletResponse response, String cookieName, String value, int maxAge, String domain) {
        Cookie cookie = new Cookie(cookieName, value);
        cookie.setPath("/");
        if(StringUtils.isNotBlank(domain)) {
            cookie.setDomain(domain);
        }

        cookie.setMaxAge(maxAge);
        response.addCookie(cookie);
    }

    public static String getCookie(HttpServletRequest request, String cookieName) {

        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals(cookieName)) {
                    return cookie.getValue();
                }
            }
        }

        return null;
    }
}

当然,FeignConfig也可以无须定义在Spring容器中。在@Feign注解上直接使用也可以生效。

@FeignClient(value = "wechat", configuration = FeignConfig.class)

推荐阅读:

SpringMVC之RequestContextHolder分析

上一篇 下一篇

猜你喜欢

热点阅读