今天对一个老项目的struts2升级到2.5.30版本,以应对之前爆出的远程执行漏洞,看了一下网上的教程,大多都比较详细,感觉也不是很难,想着半个小时应该就可以搞定来着,结果搞了一整天才调试成功,特写此文章记录一下,供众人参考。
下载和改配置都没什么问题,按照百度上其他人的操作基本都可以搞定,我的问题没有出现在struts.xml上,而是出现在了web.xml中。
按照网上说的将过滤器包路径修改为
org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
之后,无论怎么访问,都是404错误。但是过滤器确实是生效了,一方面没有报任何错误,另外直接访问过滤器根时会返回空页面而非404,只是访问具体的action时会报404。尝试修改了几个struts.xml里的配置无果后,我决定新建一个项目,排除所有的干扰,看项目能否跑起来。于是就在网上搜索了个新版本的部署教程,重新搭了一个项目,跑成功了。由于我一直以为是struts.xml的问题,所以我按照原来的配置文件一点一点添加配置并测试,结果整个配置文件的配置都复制过来了,还是可以正常访问,这时才反应过来,可能是web.xml的问题。对比新老项目后发现,原来的过滤器配置为(版本2.0.8):
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/struts/*</url-pattern>
</filter-mapping>
而新项目的过滤器并不是像网上那样直接修改包路径,而是:
<filter>
<filter-name>struts-prepare</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareFilter</filter-class>
</filter>
<filter>
<filter-name>struts-execute</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts-prepare</filter-name>
<url-pattern>/struts/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts-execute</filter-name>
<url-pattern>/struts/*</url-pattern>
</filter-mapping>
至此,升级成功,一个小小的问题成功耽误了一天时间。当然也给我留下了一个问题:为什么使用StrutsPrepareAndExecuteFilter不能正确访问action,分开为StrutsPrepareFilter和StrutsExecuteFilter之后就可以了呢?项目的web.xml中只定义了几个listener和servlet,并没有其他的过滤器,这个问题暂时还不太清楚,后续有时间了会继续研究,也欢迎知道这其中原由的大佬指点迷津!
PS:不要再问为什么还用struts2框架了,因为是老项目,比较久远了,最近慢慢开始注重网络安全才想起来把这些老项目也升一下级,仅此而已!