• HttpServletRequestWrapper改写http请求body


    package cn.xs.qishi.open.api.filter;
    
    import cn.xs.ambi.bas.util.StringUtils;
    
    import javax.servlet.ReadListener;
    import javax.servlet.ServletInputStream;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    import java.io.BufferedReader;
    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.nio.charset.StandardCharsets;
    import java.util.*;
    
    /**
     * @author liuxn
     * @date 2022/5/24
     */
    public class RequestWrapper extends HttpServletRequestWrapper {
        private Map<String, String> headerMap = new HashMap<>();
        // 重新赋值的body数据
        private String body;
        public RequestWrapper(HttpServletRequest request) {
            super(request);
        }
    
        public void addHeader(String name, String value) {
            headerMap.put(name, value);
        }
        public void setBody(String body) {
            this.body = body;
        }
    
        @Override
        public int getContentLength() {
            return this.body.getBytes(StandardCharsets.UTF_8).length;
        }
    
        @Override
        public long getContentLengthLong() {
            return this.body.getBytes(StandardCharsets.UTF_8).length;
        }
    
    
        @Override
        public ServletInputStream getInputStream() throws IOException {
            if (StringUtils.isBlank(body)) {
                body = "";
            }
            // 必须指定utf-8编码,否则json请求数据中如果包含中文,会出现异常
            final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes(StandardCharsets.UTF_8));
            return new ServletInputStream() {
                @Override
                public boolean isFinished() {
                    return false;
                }
    
                @Override
                public boolean isReady() {
                    return false;
                }
    
                @Override
                public void setReadListener(ReadListener readListener) {
                }
    
                @Override
                public int read() throws IOException {
                    return byteArrayInputStream.read();
                }
            };
        }
    
        @Override
        public BufferedReader getReader() throws IOException {
            return new BufferedReader(new InputStreamReader(this.getInputStream()));
        }
    
    
        @Override
        public String getHeader(String name) {
            String headerValue = super.getHeader(name);
            if (headerMap.containsKey(name)) {
                headerValue = headerMap.get(name);
            }
            return headerValue;
        }
    
        @Override
        public Enumeration<String> getHeaderNames() {
            List<String> names = Collections.list(super.getHeaderNames());
            names.addAll(headerMap.keySet());
            return Collections.enumeration(names);
        }
    
        @Override
        public Enumeration<String> getHeaders(String name) {
            List<String> values = Collections.list(super.getHeaders(name));
            if (headerMap.containsKey(name)) {
                values.add(headerMap.get(name));
            }
            return Collections.enumeration(values);
        }
    }
    

      

    问题记录:- Content-length different from byte array length! cl=97, array=117

    问题点:getContentLength()、getContentLengthLong()这两个方法取值不正确

    正确写法:

     @Override
        public int getContentLength() {
            return this.body.getBytes(StandardCharsets.UTF_8).length;
        }
    
        @Override
        public long getContentLengthLong() {
            return this.body.getBytes(StandardCharsets.UTF_8).length;
        }
     
  • 相关阅读:
    121. Best Time to Buy and Sell Stock
    玩转算法2.3常见的算法复杂度分析
    数组中的逆序对
    一些基本的代码模板
    230. Kth Smallest Element in a BST
    42. Trapping Rain Water
    api token
    仿百度查询
    baidu jsonp
    How to fix Error: laravel.log could not be opened?
  • 原文地址:https://www.cnblogs.com/lxn0216/p/16333926.html
Copyright © 2020-2023  润新知