接⼝请求异常,状态码为400–BadRequest
背景
项⽬中,请求接⼝的时候部分成功部分失败,失败的接⼝返回400 Bad Request。接⼝是先通过⽹关,在⽹关中将⽤户的信息封装到header中,然后去请求具体的服务。
具体的报错⽇志如下:
排查过程
项⽬的业务逻辑背景:
接⼝是能正常到⽹关中的,通过各个过滤器后理论上下⼀步就是到具体的服务中去,但是具体的服务没有接收到这个请求。也就是⽹关处理完后到具体服务这个过程中,请求丢失了或失效的。节哀顺变的安慰话语
然后发现部分正常的接⼝中,请求头中封装的⽤户信息是⽐较少的,⽽不正常的接⼝中,请求头中封装的⽤户信息是⽐较多的。
问题定位:
请求发送后最直接的反馈是400 Bad Request 程序没有看到任何报错⽇志,过了⼀段时间后请求的服务在⽇志中会输出:
2021-11-26 17:29:03.577 INFO 28521 --- [io-32215-exec-2] http11.Http11Processor : Error parsing HTTP request header
Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Request header is too large
at http11.Http11InputBuffer.fill(Http11InputBuffer.java:721) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
at http11.Http11InputBuffer.parHeader(Http11InputBuffer.java:874) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
at http11.Http11InputBuffer.parHeaders(Http11InputBuffer.java:564) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
at http11.Http11Processor.rvice(Http11Processor.java:309) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
东莞莲花山
at AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-9.0.27.jar:9.0.27]
at AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) [tomcat-embed-core-9.0.27.jar:9.0.27]
at at.util.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1579) [tomcat-embed-core-9.0.27.jar:9.0.27]
医疗救助申请at at.util.SocketProcessorBa.run(SocketProcessorBa.java:49) [tomcat-embed-core-9.0.27.jar:9.0.27]
at urrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_221]
at urrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_221]
at at.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.27.jar:9.0.27]
泡泡口香糖
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_221]
梦到打孩子然后这个报错不⼀定是⼀直会输出的,测试了⼀个晚上后⾯回去看⽇志只输了4次。这个原因暂时不明确。
回去⽹关把增强封装⽤户信息的在⽹关打印出来,通过String类的getBytes函数对⼤⼩进⾏评估,发现有问题的请求头信息⼤⼩为
做你的爱人饶天亮
springboot2.x版本中,http/1.1请求的最⼤头⼤⼩默认是8k,在http11包下的AbstractHttp11Protocol有个属性,如下:
菜板使用前怎样处理好
问题解决改良肉驴
那么知道问题是因为请求头⼤⼩超过springboot允许的最⼤限制。那么针对业务对问题进⾏解决。
⽅案⼀:
限制请求头的⼤⼩,不要让请求头的⼤⼩超出允许限制。(本⼈采取的限制,因为业务中,请求头的信息是在⽹关中需要检验的⽤户信息,不需要流到具体的服务中去)
⽅案⼆:
调⼤springboot中允许的最⼤限制,在配置⽂件中设置即可。对应的参数:rver.max-http-header-size .⾄于调⼤这个参数会不会导致其他连锁反应,暂时不请求。