问题修复记录|问题解决(struts版本升级为2.5.22,struts某些action扫描不进,调用action报404错)


文章目录

  • 问题场景
  • 问题环境
  • 问题原因
    • 一、配置是否存在问题
    • 二、代码扫描action的时候,存在问题
  • 解决方案
  • 总结
  • 参考链接
  • 随缘求赞

问题场景 因为struts报了漏洞,项目必须升级到struts2.5.22。该项目是比较老旧的项目,技术是传统的SSH3框架,即spring+struts2+Hibernate。所以升级过程算是比较繁琐,而且问题也比较多。其中遇到一种情况,Struts-Convention-Plugin插件是使用配置文件进行struts2 Action的加载,减少人为工作。其中,使用了Struts-Convention-Plugin插件的struts.convention.action.includeJars参数,自动扫描JAR包里面的action,自动加载。这里的发生的问题便是:大多数的JAR包内部的action都是正常被加载进去的,但是有一个公司公共框架的action没有被加载进去。表现形式就是调用该公告框架的action,提示404 NOT FOUND。本文就是针对这种情况进行解决的。
问题环境
软件 版本
struts 2.3 ——》 2.5.22
struts2-convention-plugin 2.5.22
问题原因 首先,从问题的描述,我们可以知道,目前是只存在单个jaraction是没有被扫描进去的。而大多数的jar包的action是可以被扫描进去的。那么,我们可以从几个方面进行问题解决:
一、配置是否存在问题 下面是struts.xml里面关于struts.convention.action.includeJars参数的配置:

熟悉正则表达式的朋友,应该可以知道该参数值的含义就是扫描所有的jar文件。而公共框架的lib包命名符合该正则表达式的值。所以这里的配置应该是没有问题的。
二、代码扫描action的时候,存在问题 既然配置没问题,那么就应该是Struts-Convention-Plugin插件在扫描jar包的时候,出现了遗漏。这样就得研究源码了。研究源码的过程比较枯燥,这里就直接贴结果了:
问题修复记录|问题解决(struts版本升级为2.5.22,struts某些action扫描不进,调用action报404错)
文章图片

由上图可以知道,过滤出来的jar,还需要从中获取jar包中存在META-INF目录的jar包文件,否则就会被过滤掉。如果jar包不存在该目录,或者META-INF目录存在问题,就会导致该jar包被过滤掉,进而导致该jar包的action没有被注册进去。所以需要检查jar包里面的配置。
解决方案 博主这边的jar包是存在META-INF目录,但是却是一个存在问题的目录。所以我将可以扫描出actionjar包里面的META-INF目录拿了出来,并进行替换。然后重新放到项目lib目录。等项目跑起来之后,是可以正常进行访问。故此,问题得到解决。
总结 虽然篇幅不长,但是这个问题的解决还是花费了几个小时进行研究。这次这个问题告诉我们,打包的时候要打包正常,本次问题的lib包是项目很久的包,属于2017年的。估计是当时打包存在问题,导致META-INF目录出现问题。
参考链接 ConventionPlugin-Actionsinjarfiles
随缘求赞 【问题修复记录|问题解决(struts版本升级为2.5.22,struts某些action扫描不进,调用action报404错)】如果我的文章对大家产生了帮忙,可以在文章底部点个赞或者收藏;
如果有好的讨论,可以留言;
如果想继续查看我以后的文章,可以点击关注
可以扫描以下二维码,关注我的公众号:枫夜之求索阁,查看我最新的分享!
问题修复记录|问题解决(struts版本升级为2.5.22,struts某些action扫描不进,调用action报404错)
文章图片

问题修复记录|问题解决(struts版本升级为2.5.22,struts某些action扫描不进,调用action报404错)
文章图片

    推荐阅读