敏感信息校验相关的东西最近一直都没动(ps: 这个功能至少上线一年半了)。但是!but! 今天他就全部报错了,午休的我默默爬起来排查反馈的问题。
1、排查
看下错误:
这些Exception基本都是 腾讯敏感校验相关接口报的错,具体报错详情如下: 可以看到是腾讯的cos sdk报错了,报错信息是在腾讯的sdk里,具体是因为腾讯的 com.qcloud.cos.auth.COSSigner.buildAuthorizationStr 没找到 org.apache.commons.codec.digest.DigestUtils
类中的方法 :sha1Hex
(这个方法的入参是String, 反参 也是String 这一点从 (Ljava/lang/String;)Ljava/lang/String 可以看出来) ok 到这里我瞬间感觉不妙, 应该是jar包问题,于是我在项目中搜索这个类(带着包名搜哦),结果如下:
fxxk 居然有俩!包名类名全部一样!由于包名类名全部一致,所以我也无法断定是用的哪个,但是可以 先看看哪个没有 sha1Hex方法! ,于是我赶紧看了看这俩货到底哪个是 真美猴王,(ps: 哪个没有sha1Hex方法哪个就是假美猴王!)
先看下 commons-codec这个jar包中的 DigestUtils类:
再看下CCP_REST_SDK-2.7r.jar 中的 DigestUtils类:
可以很明显看出: CCP_REST_SDK-2.7r.jar 中的 DigestUtils类没有 sha1Hex这个方法!
2、吐槽
- 没有sha1Hex方法也就算了。你为何连包名都和人家apache-commos-codec中的一样? 你要复制时自己改改包名,别人引入你的时候也就不会引入你这个DigestUtils类了,除非引入时指定是你的DigestUtils类,你个老六!
- 包名和apache-commos-codec一样,并且缺少人家类中的方法也就算了。你为何不升版本号直接新内容覆盖旧内容(并且旧内容还删减了东西)? 这里我是猜测,因为之前敏感词相关的是没报错的(我们的maven声明顺序,版本啥的也没有变),而自从我们凌晨重启服务后正好拉下来你们去掉sha1Hex方法的 DigestUtils类 ,跨擦! 敏感全部报错!至此 我认清你个老六了!
- 好好好,都怪我? (下边是我自己臆想的哈哈):
- CCP_REST_SDK-2.7r的内心反驳我说: 你为啥不声明apache-commos-codec在前 , CCP_REST_SDK-2.7r 在后? md关键不是我引入的呀,看下引入的pom 是在 20年引入的,擦 ,就算是我引入的我哪能知道你们不升版本就删减原版本的内容并推送到maven仓库呢?
- 求你了,我真的求你了 :
- 1求: 求你了,能不能不要随意
删减东西
并不升级版本号
就 deploy 到maven仓库? 别人用的好好的,你一删除东西,我他么不重启还没事,只要一个重启,运气不好的话立马咔嚓!over !class NotFound , method Notfound ! 哈哈,我真的求你了。求谁? 我也不知道, 那些 执行maven deploy
并删减东西
且不升级版本号
的 且你的jar包是别人尤其是其他公司在用的
! - 2求: 求你了 类名一模一样我不在乎影响也很小,但是能不能不要和别人的包名一模一样? 包名一模一样这就很容易 来个 偷梁换柱啊 ! 尤其是和apache-commos这种很常用的包!
- 1求: 求你了,能不能不要随意
3、修复
修复很简单,你不是有俩 org.apache.commons.codec.digest.DigestUtils (美猴王)? 我把假美猴王(CCP_REST_SDK-2.7r.jar中的 org.apache.commons.codec.digest.DigestUtils去掉就ok了),如何去掉?类加载时我使用agent 从classPool 删除?no 复杂了兄弟,我直接两种方式(任选一种即可)
1 or 2 :
- 第一我变一下 maven声明顺序
- 第二我看看都在哪里用到了 CCP_REST_SDK-2.7r.jar中的东西,没有用到的话直接干掉,轻松+愉快 ,干净+利索 ,哈哈哈
在报错的项目一顿排查(具体方式为:注掉CCP_REST_SDK-2.7r并编译启动
)
......
几分钟过去了
......
使用方式2 直接干掉CCP_REST_SDK-2.7r的maven依赖:
ok 排查发现,业务代码没有用到 ,只是一个工具类用到了(至于为啥这样我也不清楚,可能是最初开发时某个地方用到了CCP_REST_SDK-2.7r.jar后来又删掉了吧)
并且还没人使用这个工具类(这个工具类不是对外提供的feign client 或者什么api类型的对外的jar,只是内部使用的 内部没使用那就必然没有人用了),所以我也不调maven依赖声明顺序了,而是直接干掉 CCP_REST_SDK-2.7r的maven引用,如下:
注意把父pom和子pom的这个依赖都干掉,然后刷新maven 然后重启发现,报错没有了,可以正常检测了,如下:
ok到这里,问题解决了,还是使用apache-commons-codec这个里边的,才是原汁原味的!毕竟用的多的,更稳定更按规定来,从而也让我们的业务更有保障。
反思
改变不了别人那就 改变自己!
- maven deploy时 如果有删减东西并且是对外提供的 不管是公司其他服务或者是外部公司的,都要慎重,并且一定要升级版本号,防止你不升级版本号,其他人重启时编译时 编译不过去或者运行时报错!
- 时常检查,关注系统异常,关注预警
- 一定不要: copy知名jar中的类
且
不改包名和类名且
少方法且
不改版本号就删除东西并deploy - 别总是吐槽,吐槽两句得了哈哈,解决问题才是王道!
本文仅仅是吐槽,并没有吐槽的对象,因为我不敢呀。如果吐槽的对象非得选一个,那我就选择-------------------------------------------> null 吧!哈哈。
到这里你知道是哪个三方了吗?