先上结论:tomcat7.0-106之后的版本(包括8.5xx之后的版本,只是下了个较新的测试)改了DefualtServerlet类checkIfNoneMatch方法中的比较逻辑,导致用java中引号"与页面传过来被转义了accssi码的引号"进行比较,使结果不成立,返回了400。处理方法:在DefualtServerlet类中将界面中的If-None-Match对应的字符串中的引号"使用repalceAll替换成"即可。(只是解决问题不用看下面的内容了,下面只是作为个人记录)

补充:

1、java文件路径:org.apache.catalina.servlets.DefaultServlet

2、class文件路径:apache-tomcat-7.0.109\lib\catalina.jar——>org.apache.catalina.servlets.DefaultServlet

3、增加的内容:

headerValue = headerValue.replaceAll(""","\"");

4、前后端引号的应该在其它类中有其它的统一处理方式,我为了方便没有接着找下去。

这次问题不难解决,对我而言,难的是处理此问题的思路和定位到此问题,由于之前没有处理过这样隐藏比较深的源码问题,没有经验,定位问题不得法,以前有问题都是找度娘给答案的,此次不知道是搜索关键字不对还是没人提到这个问题,没找到答案,问了几个群,可能大家都不用tomcat了吧,也没有大佬能给出答案,无奈一步步尝试。

背景和定位过程:安全扫描,说以前版本有安全漏洞(吐槽一下:今年升级了三次了),只能进行tomcat升级了,我直接从tomcat 7.0-100升级到了7.0-109,后发现静态资源加载有问题,每天第一次登录,背景图加载出问题,F12查看图片请求时不时报400,谷歌浏览器还不容易发现问题,火狐和ie浏览器比较容易观察。

当时同时改了页面业务代码发版,还以为是自己业务界面改出来的bug,由于此现象一天只会出现一次,非常难观察,当时还没将图片显示不出与报错联系起来,因为后面有报错但图片还是能显示,谷歌浏览器更是经常看不到此报错。

后面找度娘一顿操作,都不奏效(再次吐槽一下,现在的垃圾文章太多了,各种复制粘贴,转载,找的一堆文章都是相同的,麻烦你们那些人能网上搜到的,你们又没有新的问题点,也没有新的解决方案,不要再发文章出来了行不行,制造了大量的信息垃圾),此时业务同事已经开始说时间拖得太久了(每次改了后要第二天观察页面能不能刷新出来。。。),后来想到页面增加随机数能解决静态资源加载的问题,于是死马当活马医,先将F12看到400报错处理了,惊喜发现了,后面没有每天第一次出现登录不展示背景图的问题了,变成两三天或三四天了(整个人裂开了。。。),后面继续查找,发现页面有引用其它界面,其它界面中又有调用静态资源,无奈一个个调整,好在页面不是很多。处理后基本算是正常了,应付过了业务同事了。

但自己测试时发现还是有些插件有时加载不出来,比如说日期插件,虽然刷新一下能好,业务同事也没反映此情况,但还是默默记在心里了,还有一个就是css文件中也有图片链接,此位置的请求加不了随机数,我又不会,又是一顿度娘未果(再次吐槽:不要发重复的文章了,真的很浪费时间),老外有提到一个利用jQuery实现css随机时间的操作,我前端菜,又嫌麻烦,就没进行相关改造了,暂时将此事搁置了。

在此期间,有怀疑过新版本的tomcat有bug,但未进行测试,因为就算是新版本bug,也不可能将tomcat还原成原来版本,等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、现在重复的文章太多,大量抄袭转载的,需要找到方法快速去掉重复的文章,提升获取信息的效率,排除垃圾信息的影响。

如有大佬看到了最后,帮忙提提意见,指导指导,如果有其他人已写此问题处理方法,麻烦告知链接,确认后隐藏此文章,降低大家搜到重复文章的概率。

升级tomcat导致静态资源报错400相关推荐

  1. 在AS模拟器上访问本地电脑tomcat部署的资源报错java.net.ConnectException: Failed to connect to localhost/127.0.0.1:8081

    前言 平时为了做些安卓测试,我也会写一下后端的东西.已经有好长一段时间没写过服务端相关的内容了,今天看着郭霖的<第一行代码>,我把一个xml资源部署到了tomcat服务器上,在浏览器上是可 ...

  2. 解决Tomcat下IntelliJ IDEA报错java.lang.NoClassDefFoundError: javax/servlet/ServletContextListener

    解决Tomcat下IntelliJ IDEA报错java.lang.NoClassDefFoundError: javax/servlet/ServletContextListener   笔者在做代 ...

  3. VMware虚拟机更改静态IP报错Unit network.service entered failed state解决方案

    VMware虚拟机更改静态IP报错Unit network.service entered failed state解决方案 问题背景 解决方案一 解决方案二 Lyric: 就算没伴奏也可以继续 问题 ...

  4. get请求报错400状态码

    get请求报错400状态码  请求参数带  {} 在tomcat 7版本中没有问题,可以正常返回请求 在tomcat8.5.35 版本中 请求报错400 原因分析: Tomcat的新版本中增加了一个新 ...

  5. 前端请求后台报错400

    报错原因:前端请求的字段名称或者字段类型和后台编写的实体类不一样,或者前端提交的参数和后台需要的参数个数不匹配,导致无法封装,报错400. 解决方法:仔细对照前后端字段类型,保证字段类型一致

  6. SAP S4HANA 账户组的配置里'Int.Std.Grping'选项没勾选导致ABAP程序报错

    SAP S4HANA 账户组的配置里'Int.Std.Grping'选项没勾选导致ABAP程序报错 BP,试图创建一个新的vendor code, 角色是ZGM001, Grouping是G001, ...

  7. 什么是Tomcat响应静态资源?

    Tomcat访问所有的资源,都是用Servlet来实现的,所以Tomcat又叫Servlet容器,什么都交给Servlet来处理.当然,静态资源也不例外.静态资源可以理解为前端的固定页面,如css,h ...

  8. tomcat闪退没有报错_Appium在Android平台几种常见报错的解决方案

    在Appium测试中,初学者也许会遇到以下报错或者问题: 1.urllib2.URLError: Appium运行中报错如上,有两种可能: (1)发现是由于自己手机上连接了代理,去掉代理,以上报错消失 ...

  9. 请求nginx静态资源报403

    [README] 请求nginx静态资源报403: [1]原因 静态资源防止在某个家目录下,如 /root 目录下 [2] 解决方法1 nginx.conf 文件没有指定用户 # user nobod ...

最新文章

  1. Reactor/Proactor的比较 (ZZ)
  2. 牛!江苏老人用AIoT技术管理千亩良田
  3. ThreadPoolExecutor使用和思考(上)-线程池大小设置与BlockingQueue的三种实现区别
  4. 图片呈现jQuery中fadeIn、fadeOut、fadeTo的用法(图片隐藏与显示)
  5. Python中文编程
  6. 一图掌握ICT项目管理流程图「实例」
  7. 关于文件夹目录权限的一些思路
  8. 为什么你的ASO效果不好_ASO优化重要吗
  9. 上海车牌拍卖服务器响应时间,上海拍牌技巧:”48秒+700” 最晚出价为55秒
  10. SpringBoot 系列教程(九十二):Spring Boot全局设置Jackson时间处理
  11. androidx指纹验证
  12. 高德地图python爬虫 商家_Python3 | 通过百度地图API获取商家详细信息
  13. 徒手撸一个记账本(附源码)
  14. 当贝X3 Pro与极米H5哪个画质好,哪一款更值得购买?
  15. 知乎上那些简短却非常深刻的回答
  16. R语言实战应用精讲50篇(十二)-正态分布与方差齐性的检验方法与SPSS操作
  17. android adb shell杀进程
  18. isArray 函数,转自 笨笨狗 blog
  19. 苹果三代耳机_P130 【AirPods 3代】绝对性的福利!“地表最强真无线耳机” 苹果第三代AirPods Pro蓝牙耳机、妙不可言!...
  20. R语言实战(九)主成分和因子分析

热门文章

  1. 复杂网络 介数中心性 java_复杂网络算法中K—shell与介数中心性算法的实现
  2. YOLOv5/v7 应用轻量级通用上采样算子CARAFE
  3. 纯CSS3手风琴图片滑动特效
  4. 中集集团全球港航人工智能独角兽中集飞瞳,全球最先进港航人工智能AI核心技术及工业级产品,新一代人工智能港口智能化船公司智能化方案
  5. 租房水电缴费管理MYSQL设计
  6. pandas获取月底最后一个交易日对应数据
  7. Javascript随机点名系统
  8. 安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】
  9. (收藏向)超齐全常用python库汇总,有备无患!
  10. Linux带箭头的截图软件,Flameshot:你们要的超强Linux截图软件