springboot feign拦截器实现token透传

376 阅读1分钟
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.List;

@Configuration
public class MyRequestInterceptor implements RequestInterceptor {

    private static final List<String> NO_NEED_TO_PASS_HEADER_NAME_LIST = Arrays.asList("content-type", "host", "accept-encoding", "transfer-encoding", "content-length");

    public void apply(RequestTemplate template) {
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        if (requestAttributes != null) {
            HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
            Enumeration<String> headerNames = request.getHeaderNames();
            if (headerNames != null) {
                while (headerNames.hasMoreElements()) {
                    String name = headerNames.nextElement();
                    if (NO_NEED_TO_PASS_HEADER_NAME_LIST.contains(name)) {
                        continue;
                    }
                    Enumeration<String> values = request.getHeaders(name);
                    while (values.hasMoreElements()) {
                        String value = values.nextElement();
                        template.header(name, value);
                    }
                }
            }
        }
    }