在一个正常划水的周三的下午,发现一个偷偷划水的不正常接口,在login(登陆)接口之后的getPerms接口突然报了400
哈! 400这种问题太好解决了,不用看就是参数的问题,不是参数类型错误就是参数名称错误.然鹅,这次并不是,你要问我为什么的话,我只能回答你,这个Get方法没有参数😂.
这个接口是个什么接口呢? 这个接口是用户登录之后根据用户角色获取用户权限树的一个接口,因为是公司的项目,代码我就不贴了,这里只说发生的原因,及如何解决的,给其他遇到类似问题的朋友提供一个排查的方向.
BUG的原因是因为request的header部分太大,超过了tomcat允许的最大值。默认情况下,tomcat(8.0版本)允许的http请求header的最大值是8024个字节(8KB),如何造成的呢,是因为在这个接口之前的login接口中,开发人员将用户的所用信息及权限信息一股脑的都塞到了request.getAttributes().put("userInfo",JSON.toJSONString(userLoginVO)); 而该用户信息有多大呢,单单是角色下的权限信息就达到了9.6KB,这个时候login接口请求成功之后,login后面的接口因为header部分太大就会造成请求失败,
这个BUG我们找了两天,为什么找了两天,刚开始定位不到问题,上网搜400的问题也找不到答案,只能通过一点点的测试寻找一些蛛丝马迹,你问我为什么不直接看错误日志,我只能说没有错误日志,看不到任何异常,在解决了这个问题之后,又到网上去搜head大小相关的问题才找到了一些相关的帖子,发现是有错误日志的,
通过日志note信息发现,该条日志在info级别下只会打印一次,之后都会是debug级别才打印,所以我们当时没有注意到.图是从别的帖子里借鉴过来的 (关于http header最大长度的那些事);
说了这么多,你肯定是比较关心我是如何解决的这个问题的,其实很简单,所有以及定位出来的问题都不叫问题.呐,我们现在面临的问题是什么,head数据过大超过了tomcat规定的默认值嘛,解决方案有两种,我们用的第一种.
第一种
空间不足就扩大空间咯,tomcat默认是8KB不够用,你给它设的大一点不就好了
在你项目的配置信息里设置(小声bb:不知道配哪的同学看过来,就配到你设置项目端口号的地方,server.port=8080的下面)
server.max-http-header-size=102400
第二种
第二种解决方案就更简单了,既然head空间有限,除了用户基本信息跟token其他多余的信息你不往里写不完了嘛😂