class ZuulStrategyContextHolder extends AbstractStrategyContextHolder {
    // 如果外界也传了相同的Header，例如，从Postman传递过来的Header，当下面的变量为true，以网关设置为优先，否则以外界传值为优先
    @Value("${" + ZuulStrategyConstant.SPRING_APPLICATION_STRATEGY_ZUUL_HEADER_PRIORITY + ":true}")
    protected Boolean zuulHeaderPriority;

    // 当以网关设置为优先的时候，网关未配置Header，而外界配置了Header，仍旧忽略外界的Header
    @Value("${" + ZuulStrategyConstant.SPRING_APPLICATION_STRATEGY_ZUUL_ORIGINAL_HEADER_IGNORED + ":true}")
    protected Boolean zuulOriginalHeaderIgnored;

    // Zuul上核心策略Header是否传递。当全局订阅启动时，可以关闭核心策略Header传递，这样可以节省传递数据的大小，一定程度上可以提升性能
    // 核心策略Header指n-d-开头的Header（不包括n-d-env，因为环境路由隔离，必须传递该Header），不包括n-d-service开头的Header
    @Value("${" + ZuulStrategyConstant.SPRING_APPLICATION_STRATEGY_ZUUL_CORE_HEADER_TRANSMISSION_ENABLED + ":true}")
    protected Boolean zuulCoreHeaderTransmissionEnabled;

    public HttpServletRequest getRequest() {
        HttpServletRequest request = ZuulStrategyContext.getCurrentContext().getRequest();
        if (request == null) {
            request = RequestContext.getCurrentContext().getRequest();
        }

        if (request == null) {
            // LOG.warn("The HttpServletRequest object is lost for thread switched, or it is got before context filter probably");

            return null;
        }

        return request;
    }

    public Map<String, String> getZuulRequestHeaders() {<FILL_FUNCTION_BODY>}

    @Override
    public Enumeration<String> getHeaderNames() {
        HttpServletRequest request = getRequest();
        if (request == null) {
            return null;
        }

        Enumeration<String> headerNames = request.getHeaderNames();

        Map<String, String> headers = getZuulRequestHeaders();
        if (MapUtils.isNotEmpty(headers)) {
            List<String> headerNameList = Collections.list(headerNames);

            for (Map.Entry<String, String> entry : headers.entrySet()) {
                String headerName = entry.getKey();
                if (!headerNameList.contains(headerName)) {
                    headerNameList.add(headerName);
                }
            }

            return Collections.enumeration(headerNameList);
        }

        return headerNames;
    }

    @Override
    public String getHeader(String name) {
        HttpServletRequest request = getRequest();
        if (request == null) {
            return null;
        }

        if (!zuulCoreHeaderTransmissionEnabled) {
            boolean isCoreHeaderContains = StrategyUtil.isCoreHeaderContains(name);
            if (isCoreHeaderContains) {
                return null;
            }
        }

        if (zuulHeaderPriority) {
            // 来自于Zuul Filter的Header
            Map<String, String> headers = getZuulRequestHeaders();
            String header = null;
            if (MapUtils.isNotEmpty(headers)) {
                header = headers.get(name);
            }
            if (StringUtils.isEmpty(header)) {
                if (StrategyUtil.isCoreHeaderContains(name) && zuulOriginalHeaderIgnored) {
                    header = null;
                } else {
                    // 来自于外界的Header
                    header = request.getHeader(name);
                }
            }

            return header;
        } else {
            // 来自于外界的Header
            String header = request.getHeader(name);
            if (StringUtils.isEmpty(header)) {
                // 来自于Zuul Filter的Header
                Map<String, String> headers = getZuulRequestHeaders();
                if (MapUtils.isNotEmpty(headers)) {
                    header = headers.get(name);
                }
            }

            return header;
        }
    }

    @Override
    public String getParameter(String name) {
        HttpServletRequest request = getRequest();
        if (request == null) {
            return null;
        }

        return request.getParameter(name);
    }

    public Cookie getHttpCookie(String name) {
        HttpServletRequest request = getRequest();
        if (request == null) {
            return null;
        }

        Cookie[] cookies = request.getCookies();
        if (cookies == null) {
            return null;
        }

        for (int i = 0; i < cookies.length; i++) {
            Cookie cookie = cookies[i];
            String cookieName = cookie.getName();
            if (StringUtils.equals(cookieName, name)) {
                return cookie;
            }
        }

        return null;
    }

    @Override
    public String getCookie(String name) {
        Cookie cookie = getHttpCookie(name);
        if (cookie != null) {
            return cookie.getValue();
        }

        return null;
    }

    public String getRequestURL() {
        HttpServletRequest request = getRequest();
        if (request == null) {
            return null;
        }

        return request.getRequestURL().toString();
    }

    public String getRequestURI() {
        HttpServletRequest request = getRequest();
        if (request == null) {
            return null;
        }

        return request.getRequestURI();
    }
}

        Map<String, String> headers = ZuulStrategyContext.getCurrentContext().getHeaders();
        if (headers == null) {
            headers = RequestContext.getCurrentContext().getZuulRequestHeaders();
        }

        if (headers == null) {
            // LOG.warn("The Headers object is lost for thread switched, or it is got before context filter probably");

            return null;
        }

        return headers;
    
<methods>public non-sealed void <init>() ,public java.lang.String getContext(java.lang.String) ,public java.lang.String getContextRouteAddress() ,public java.lang.String getContextRouteAddressBlacklist() ,public java.lang.String getContextRouteAddressFailover() ,public java.lang.String getContextRouteEnvironment() ,public java.lang.String getContextRouteEnvironmentFailover() ,public java.lang.String getContextRouteIdBlacklist() ,public java.lang.String getContextRouteRegion() ,public java.lang.String getContextRouteRegionFailover() ,public java.lang.String getContextRouteRegionTransfer() ,public java.lang.String getContextRouteRegionWeight() ,public java.lang.String getContextRouteVersion() ,public java.lang.String getContextRouteVersionFailover() ,public java.lang.String getContextRouteVersionPrefer() ,public java.lang.String getContextRouteVersionWeight() ,public java.lang.String getContextRouteZoneFailover() ,public com.nepxion.discovery.plugin.framework.adapter.PluginAdapter getPluginAdapter() ,public java.lang.String getRouteAddress() ,public java.lang.String getRouteAddressBlacklist() ,public java.lang.String getRouteAddressFailover() ,public java.lang.String getRouteEnvironment() ,public java.lang.String getRouteEnvironmentFailover() ,public java.lang.String getRouteIdBlacklist() ,public java.lang.String getRouteRegion() ,public java.lang.String getRouteRegionFailover() ,public java.lang.String getRouteRegionTransfer() ,public java.lang.String getRouteRegionWeight() ,public java.lang.String getRouteVersion() ,public java.lang.String getRouteVersionFailover() ,public java.lang.String getRouteVersionPrefer() ,public java.lang.String getRouteVersionWeight() ,public java.lang.String getRouteZoneFailover() ,public java.lang.String getSpanId() ,public com.nepxion.discovery.plugin.strategy.wrapper.StrategyWrapper getStrategyWrapper() ,public java.lang.String getTraceId() <variables>protected com.nepxion.discovery.plugin.framework.adapter.PluginAdapter pluginAdapter,protected com.nepxion.discovery.plugin.strategy.monitor.StrategyMonitorContext strategyMonitorContext,protected com.nepxion.discovery.plugin.strategy.wrapper.StrategyWrapper strategyWrapper