APP请求后端接口,莫名奇妙报错,前往后台查看日志还行报了下面的错误
02-03 23:52:37.853 ERROR [o.a.c.c.C.[.[localhost].[/].[dispatcherServlet]] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.io.IOException: org.apache.tomcat.util.http.fileupload.FileUploadException: java.io.EOFException: Unexpected EOF read on the socket] with root cause
java.io.EOFException: Unexpected EOF read on the socket
at org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:788)
at org.apache.coyote.http11.Http11InputBuffer.access$300(Http11InputBuffer.java:42)
at org.apache.coyote.http11.Http11InputBuffer$SocketInputBuffer.doRead(Http11InputBuffer.java:1133)
at org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:102)
at org.apache.coyote.http11.Http11InputBuffer.doRead(Http11InputBuffer.java:249)
at org.apache.coyote.Request.doRead(Request.java:551)
at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:336)
at org.apache.catalina.connector.InputBuffer.checkByteBufferEof(InputBuffer.java:632)
at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:362)
at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:132)
at java.io.FilterInputStream.read(FilterInputStream.java:133)
at org.apache.tomcat.util.http.fileupload.util.LimitedInputStream.read(LimitedInputStream.java:132)
at org.apache.tomcat.util.http.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:977)
at org.apache.tomcat.util.http.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:881)
at java.io.InputStream.read(InputStream.java:101)
at org.apache.tomcat.util.http.fileupload.util.Streams.copy(Streams.java:98)
at org.apache.tomcat.util.http.fileupload.util.Streams.copy(Streams.java:68)
at org.apache.tomcat.util.http.fileupload.MultipartStream.readBodyData(MultipartStream.java:572)
将请求拿出来,参数什么的一样,使用postMan提交正常,采用APP访问接口就失败。
后面怀疑是不是请求头不一样,请求头也一致后发现postMan提交也失败了。
不带请求头使用postMan提交发现, Content-Length:659 用Fiddler拦截看到的, 对比APP提交拦截的Content-Length不一致 , 在postMan中不指定Content-Length ,
会在提交的时候自己计算。 后面我手动设置 Content-Length:660 > 659, 发现请求就和APP请求一样报错了。
APP请求拦截的请求头Content-Length: 777
postMan请求不主动带Content-Length的话默认是在请求发生的时候计算出来的
手动指定Content-Length: 660 postMan请求一样报错了
总结: Content-Length 是表示请求的字节长度 , 服务的根据这个头去读取流,当读取到659的时候流已经到EOF结束了,但是APP设置的是777长度,服务端就认为请求流应该还没读取完,所以就报错了。
这个需要APP同事排查下为什么是 777 长度,这个长度不对