MyFeignInterceptor.java 1.86 KB
package com.tanpu.community.config;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Map;

/**
 * @description: 透传spring 头信息
 * @author: wanglei
 * @created: 2020/05/08 11:55
 */
@Slf4j
@Component
public class MyFeignInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate template) {

        HttpServletRequest request = getHttpServletRequest();

        if (request != null) {
            Map<String, Collection<String>> feignHeaders = template.headers();
            Enumeration<String> headerNames = request.getHeaderNames();
            while (headerNames.hasMoreElements()) {
                String name = headerNames.nextElement();
                // 不覆盖feign的头信息
                if (!feignHeaders.containsKey(name) ) {
                    // if (name.equalsIgnoreCase("uid") || name.equalsIgnoreCase("tamptoken")){
                        template.header(name, request.getHeader(name));
                    // }
                }
            }
            log.debug("添加后的头信息:{}", template.headers());
        } else {
            log.debug("没有添加feign头信息");
        }
    }

    /**
     * 如果不是从controller过来的请求(例如定时器等),是没有request对象的
     */
    private HttpServletRequest getHttpServletRequest() {
        try {
            return ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
        } catch (Exception e) {
        }
        return null;
    }
}