zoukankan      html  css  js  c++  java
  • springCloud 使用feign复制请求头调用其他服务 content-length不一致导致调用失败

    背景:目前需要前端需要从B系统中获取数据,请求先发送到A系统,然后由A系统使用Feign调用B系统的接口,由于调用B系统时需要将请求的用户相关信息一起带到B系统,所以是用的Feign的请求拦截对其进行请求头复制

    以下是请求头复制的拦截器

    package cn.rivamed.hvc.filter;
    
    import feign.RequestInterceptor;
    import feign.RequestTemplate;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    
    import javax.servlet.http.HttpServletRequest;
    import java.util.Enumeration;
    import java.util.LinkedHashMap;
    import java.util.Map;
    
    /**
     * 描述: TODO
     * 公司 北京瑞华康源科技有限公司
     * 版本 rivamed2019
     *
     * @version V2.0.1
     * @author: 左健宏
     * @date: 2019-12-20 13:08
     */
    @Configuration
    public class FeginInterceptor implements RequestInterceptor {
        @Override
        public void apply(RequestTemplate requestTemplate) {
            try {
                Map<String,String> headers = getHeaders();
                for(String headerName : headers.keySet()){
                    requestTemplate.header(headerName, headers.get(headerName));
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        private Map<String, String> getHeaders(){
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            Map<String, String> map = new LinkedHashMap<>();
            Enumeration<String> enumeration = request.getHeaderNames();
            while (enumeration.hasMoreElements()) {
                String key = enumeration.nextElement();
                String value = request.getHeader(key);
    //            if ("content-length".equals(key)) {
    //                continue;
    //            }
                map.put(key, value);
            }
            return map;
        }
    
    }

    该拦截器复制了所有请求头,包括content-length(重点),最初浮现的问题是

     在postMan写入的json不规范导致请求B系统报错

    org.springframework.http.converter.HttpMessageNotReadableException: I/O error while reading input message; nested exception is org.apache.catalina.connector.ClientAbortException: java.io.EOFException: Unexpected EOF read on the socket

    如果规范就没问题

     经过多次踩坑才知道特喵的 content-length是由body里面字符数控制的

    所以问题明了了,贴上解决后的拦截器

    package cn.rivamed.hvc.filter;
    
    import feign.RequestInterceptor;
    import feign.RequestTemplate;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    
    import javax.servlet.http.HttpServletRequest;
    import java.util.Enumeration;
    import java.util.LinkedHashMap;
    import java.util.Map;
    
    /**
     * 描述: TODO
     * 公司 北京瑞华康源科技有限公司
     * 版本 rivamed2019
     *
     * @version V2.0.1
     * @author: 左健宏
     * @date: 2019-12-20 13:08
     */
    @Configuration
    public class FeginInterceptor implements RequestInterceptor {
        @Override
        public void apply(RequestTemplate requestTemplate) {
            try {
                Map<String,String> headers = getHeaders();
                for(String headerName : headers.keySet()){
                    requestTemplate.header(headerName, headers.get(headerName));
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        private Map<String, String> getHeaders(){
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            Map<String, String> map = new LinkedHashMap<>();
            Enumeration<String> enumeration = request.getHeaderNames();
            while (enumeration.hasMoreElements()) {
                String key = enumeration.nextElement();
                String value = request.getHeader(key);
                if ("content-length".equals(key)) {
                    continue;
                }
                map.put(key, value);
            }
            return map;
        }
    
    }

    content-length详解参考文章 :https://juejin.im/post/5d772cb4e51d453b5f1a0502

  • 相关阅读:
    bzoj 1031: [JSOI2007]字符加密Cipher 後綴數組模板題
    hdu3949 XOR xor高斯消元
    The xor-longest Path
    Contest20140906 反思
    Contest20140906 ProblemC 菲波拉契数制 DP
    Contest20140906 ProblemA dp+线段树优化
    bzoj 1257: [CQOI2007]余数之和sum 数学 && 枚举
    tyvj P1716
    BZOJ 1012 [JSOI2008]最大数maxnumber【线段树】
    Bzoj1083 1083: [SCOI2005]繁忙的都市【MST】
  • 原文地址:https://www.cnblogs.com/guanxiaohe/p/12105920.html
Copyright © 2011-2022 走看看