升级tomcat导致静态资源报错400
升级tomcat导致静态资源报错400升级tomcat导致静态资源报错400
先上结论:tomcat7.0-106之后的版本(包括8.5xx之后的版本,只是下了个较新的测试)改了DefualtServerlet类checkIfNoneMatch ⽅法中的⽐较逻辑,导致⽤java中引号"与页⾯传过来被转义了accssi码的引号&-quot;(此处多加了⼀个符号-)进⾏⽐较,使结果不成⽴,返回了400。处理⽅法:在DefualtServerlet类中将界⾯中的If-None-Match对应的字符串中的引号&-quot;(此处多加了⼀个符号-)使⽤repalceAll替换成"即可。(只是解决问题不⽤看下⾯的内容了,下⾯只是作为个⼈记录)
这次问题不难解决,对我⽽⾔,难的是处理此问题的思路和定位到此问题,由于之前没有处理过这样隐藏⽐较深的源码问题,没有经验,定位问题不得法,以前有问题都是度娘给答案的,此次不知道是搜索关键字不对还是没⼈提到这个问题,没到答案,问了⼏个,可能⼤家都不⽤tomcat了吧,也没有⼤佬能给出答案,⽆奈⼀步步尝试。
背景和定位过程:安全扫描,说以前版本有安全漏洞(吐槽⼀下:今年升级了三次了),只能进⾏tomcat升级了,我直接从tomcat 7.0-100升级到了7.0-109,后发现静态资源加载有问题,每天第⼀次登录,背景图加载出问题,F12查看图⽚请求时不时报400,⾕歌浏览器
黄日华版天龙八部演员表
还不容易发现问题,⽕狐和ie浏览器⽐较容易观察,如下图怎么查高考分数
当时同时改了页⾯业务代码发版,还以为是⾃⼰业务界⾯改出来的bug,由于此现象⼀天只会出现⼀次,⾮常难观察,当时还没将图⽚显⽰不出与报错联系起来,因为后⾯有报错但图⽚还是能显⽰,⾕
歌浏览器更是经常看不到此报错。
后⾯度娘⼀顿操作,都不奏效(再次吐槽⼀下,现在的垃圾⽂章太多了,各种复制粘贴,转载,的⼀堆⽂章都是相同的,⿇烦你们那些⼈能⽹上搜到的,你们⼜没有新的问题点,也没有新的解决⽅案,不要再发⽂章出来了⾏不⾏,制造了⼤量的信息垃圾),此时业务同事已经开始说时间拖得太久了(每次改了后要第⼆天观察页⾯能不能刷新出来。。。),后来想到页⾯增加随机数能解决静态资源加载的问题,于是死马当活马医,先将F12看到400报错处理了,惊喜发现了,后⾯没有每天第⼀次出现登录不展⽰背景图的问题了,变成两三天或三四天了(整个⼈裂开了。。。),后⾯继续查,发现页⾯有引⽤其它界⾯,其它界⾯中⼜有调⽤静态资源,⽆奈⼀个个调整,好在页⾯不是很多。处理后基本算是正常了,应付过了业务同事了。
但⾃⼰测试时发现还是有些插件有时加载不出来,⽐如说⽇期插件,虽然刷新⼀下能好,业务同事也没反映此情况,但还是默默记在⼼⾥了,还有⼀个就是css⽂件中也有图⽚链接,此位置的请求加不了随机数,我⼜不会,⼜是⼀顿度娘未果(再次吐槽:不要发重复的⽂章了,真的很浪费时间),⽼外有提到⼀个利⽤jQuery实现css随机时间的操作,我前端菜,⼜嫌⿇烦,就没进⾏相关改造了,暂时将此事搁置了。
中国三大餐饮富豪在此期间,有怀疑过新版本的tomcat有bug,但未进⾏测试,因为就算是新版本bug,也不可能将tomc
还珠之轩斗at还原成原来版本,等tomcat开发⼈员进⾏更新了,毕竟安全扫描过不去,期间有去官⽹看最近tomcat各版本bug修复记录,但貌似都没有提到400的错误或更新导致此错误,包括⽹上查询都没⼈提到新版本的400问题,其它原因导致的400的⽂章倒是⼀⼤堆重复的⽂章,后⾯拖了⼀段时间后,发现不再⽀持tomcat 7版本的更新了。再后来⼯作闲暇之余,将7.0.100到7.0.109逐个测试了⼀下,确认此问题是tomcat 7.0.106带⼊的,⾄此,算是触到了此问题的门路了,但怎么定位是哪⾥导致的⼜是⼀个费事的地⽅,前⾯提到过,去官⽹bug修复记录⾥查看,未到106版本关于此问题的描述。后⾯将105、106源码都导出来,未发现哪⾥变动导致的,在idea中查400,⼀堆信息,⽤⽐较⼯具查看,106版本相对于105版本改变的⽂件也⾮常多,快速看了两遍也没发现问题,也没耐⼼看下去,其实再细⼼点也能发现问题,实在没办法,使⽤源码跑⼀下项⽬,期望通过打⼀些断点能够到问题所在,最终只能是失望了,后⾯忙着业务开发就暂且未管了。
最近⼜有空余时间了,去看了些tomcat源码⽂章(⼤量重复⽂章,讲的内容⼜⼀笔带过),还是没有思路,于是⼜⽤⽐较⼯具查看,这次时间较多,耐⼼的⼀个⽂件⼀个⽂件的查看变动得位置,终于在changelog⽂件⾥看到400字样,当时那个⼼情呀,⼀则因为终于到问题所在了,⼀则因为⾃⼰不清楚源码中有changelog这个⽂件,还有对源码的不熟悉。后来为了查这次修改改动了那些⽂件,⼜去git上拉源码,查变更⽇志,将此次变更的⼏个⽂件逐⼀查看,终于在DefaultServlet的变更中看到了
试用期自我评价
HttpServletResponse.SC_BAD_REQUEST常量,点进去⼀看,果然对应的数值就是400了,其实前⾯使⽤对⽐⼯具⽐较差异时,也看到了这个类和这个常量,只是没有细⼼考虑。于是将断点都设置在这个⽅法中了,确认是进到此⽅法,在图中第④处返回了错误信息,当时也是不清楚为啥⾛到这⾥了,然后继续查相关⽂章,使⽤DefaultServlet、checkIfNoneMatch、"If-None-Match"查到了些相关⽂章,但都是以前版本的tomcat,对此还是⽆解,后⾯⼜⽆意间到⽂章提到了304,指出页⾯的静态资源再次请求时会将"If-None-Match"对应的值与此类中再次⽣成的值进⾏⽐较,相同则返回304,浏览器使⽤⾃⾝缓存的静态资源。再次debug并进⽐较⽅法中,发现浏览器界⾯传过来的的引号被转义成accssi码了,⽐较⽅法中未作任何转换直接进⾏⽐较,导致将引号"与&进⾏⽐较,导致第③处返回null,进⼊图中第④处后返回400给浏览器了,图⽚就加载失败了。
将此处界⾯传⼊的值中转义过得分号替换掉后,问题得到解决,将tomcat源码编译替换测试环境的⽂件后,测试环境也正常,于是将原来加过了的随机数还原,测试后也正常,⾄此,整个修改经历告⼀段落。
问题反思:
1、确认问题时,采⽤控制变量,先将⾃⼰业务代码还原,进⾏测试观察,再将tomcat等框架或插件还原,定位是什么插件或模块引起的问题,然后再使⽤不同版本确认哪⼀个版本带来的问题。
2、确认源码有问题后,先看官⽹问题修复记录,再看源码变更记录,将问题可能出现的范围尽量缩⼩,缩⼩后才去debug测试,不然直接debug极其费时间和精⼒。搬迁补偿
3、还是需要经常想静静,每次处理问题没思绪后,继续处理都是越想越乱,⼀顿王⼋拳乱挥,这⾥试⼀下那⾥试⼀下,有新的思路都是停⽌⼀段时间再次处理的时候,可现在国内公司都是赶⼯形式吧,不会让你有那么多时间去处理⼀个问题,哪⾥会让你有时间想静静,只会说你⼯作不饱和,这也是和国外的创造⼒、创新能⼒有关吗,不得⽽知。。。
4、现在重复的⽂章太多,⼤量抄袭转载的,需要到⽅法快速去掉重复的⽂章,提升获取信息的效率,排除垃圾信息的影响。
如有⼤佬看到了最后,帮忙提提意见,指导指导,如果有其他⼈已写此问题处理⽅法,⿇烦告知链接,确认后隐藏此⽂章,降低⼤家搜到重
复⽂章的概率。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。