【SpringBoot】SpringBoot项目 报java.nio.charset.MalformedInputException: Input length = 1异常

在项目中,为了在参数序列化前拦截接口请求参数,作者重写了HttpServletRequestWrapper。由于未在过滤器中处理MultipartFiler类型的请求,导致读取流时出现java.nio.charset.MalformedInputException。解决方案是在过滤器中添加判断,对于MultipartFiler不使用自定义wrapper读流。问题源于对文件上传请求的处理不当。

问题原因 :

        因为项目中需要在参数序列化之前拦截接口实际调用的请求参数,所以重写了HttpServletRequestWrapper的相关方法。在过滤器中处理的时候没有对文件上传的MultipartFiler 的request进行过滤处理, 导致自定义的warpper中读取流的时候报java.nio.charset.MalformedInputException: Input length = 1异常

解决方式:

        在过滤器中加上判断, 如果是MultipartFiler不进行自定义的warpper读流处理

具体代码实现请参考: 重写HttpServletRequestWrapper,重复读取request请求流

堆栈信息:

java.nio.charset.MalformedInputException: Input length = 1
	at java.nio.charset.CoderResult.throwException(CoderResult.java:281)
	at org.apache.tomcat.util.buf.B2CConverter.convert(B2CConverter.java:239)
	at org.apache.catalina.connector.InputBuffer.realReadChars(InputBuffer.java:403)
	at org.apache.catalina.connector.InputBuffer.checkCharBufferEof(InputBuffer.java:610)
	at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:435)
	at org.apache.catalina.connector.CoyoteReader.read(CoyoteReader.java:108)
	at org.apache.catalina.connector.CoyoteReader.readLine(CoyoteReader.java:163)
	at com.dict.aicall.common.utils.RequestReadUtils.read(RequestReadUtils.java:27)
	at com.xxx.xxx.MyHttpServletRequestWrapper.<init>(MyHttpServletRequestWrapper.java:32)
	at com.xxx.xxx.MyFilter.doFilter(MyFilter.java:36)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1722)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)

源码分析:

底层方法调用链路图

 该问题仅限本人重写HttpServletRequestWrapper在处理request的时候未过滤掉MultipartFiler导致。如有相同情况希望能帮到你。最后感谢大家的阅读!!!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值