文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

java.nio.charset.MalformedInputException: Input length = 1

2023-09-03 12:58

关注

产生的错误

java.nio.charset.MalformedInputException: Input length = 1

发生的原因

post请求接收数据时,由于对接方发送过来的数据量过大,经过nginx时,被Gzip进行数据流压缩,导致使用InputStream 流读取body数据抛出上述异常

解决方案

配置拦截器

对指定的路径进行拦截器body进行Gzip解压处理

import java.io.IOException;import java.util.Arrays;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.annotation.WebFilter;import javax.servlet.http.HttpServletRequest;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Component;@Component@WebFilter(        filterName = "GZIPFilter",        urlPatterns = {"/test/**"})@Slf4jpublic class GZIPFilter implements Filter {    private static final String[] gzipPath = new String[]{"/test/add"};    public GZIPFilter() {    }    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {        HttpServletRequest req = (HttpServletRequest) request;        String url = req.getRequestURI();        log.info(" url: {}", url);        if (Arrays.asList(gzipPath).contains(url)) {            // 对指定路径下的请求进行gzip解压            chain.doFilter(new GZIPRequestWrapper((HttpServletRequest) request), response);        } else {            chain.doFilter(request, response);        }    }    public void destroy() {    }}

解压

解压gzip

import lombok.extern.slf4j.Slf4j;import java.io.IOException;import java.util.zip.GZIPInputStream;import javax.servlet.ReadListener;import javax.servlet.ServletInputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;@Slf4jpublic class GZIPRequestWrapper extends HttpServletRequestWrapper {    private HttpServletRequest request;    public GZIPRequestWrapper(HttpServletRequest request) {        super(request);        this.request = request;    }    public ServletInputStream getInputStream() throws IOException {        ServletInputStream stream = this.request.getInputStream();        String contentEncoding = this.request.getHeader("Content-Encoding");        log.info(" contentEncoding: {}", contentEncoding);        if (null != contentEncoding && contentEncoding.indexOf("gzip") != -1) {            try {                final GZIPInputStream gzipInputStream = new GZIPInputStream(stream);                ServletInputStream newStream = new ServletInputStream() {                    public int read() throws IOException {                        return gzipInputStream.read();                    }                    public boolean isFinished() {                        return false;                    }                    public boolean isReady() {                        return false;                    }                    public void setReadListener(ReadListener arg0) {                    }                };                return newStream;            } catch (Exception var5) {                var5.printStackTrace();            }        }        return stream;    }}

来源地址:https://blog.csdn.net/xiaomzhng/article/details/131358886

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯