Struts2升级到2.5.30,问题解决及过程记录

本文档详细记录了将Struts2从旧版本升级到2.5.30的过程中遇到的问题及解决方案,包括JDK版本要求、Jar包升级、过滤器迁移、struts.xml配置修改、国际化处理、注解变更、ActionContext调整、标签更新以及自定义标签的FTL文件问题。通过逐步排查和适配,成功完成升级并确保项目正常运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Struts2升级到2.5.30


前言

由于Struts2被爆出了远程执行漏洞需要升级版本到2.5.30解决


一、Struts2远程漏洞描述

https://cwiki.apache.org/confluence/display/WW/Version+Notes+2.5.30

二、本机环境描述

JDK版本:1.8
Spring版本:5.3.10
手动版本管理(未使用Maven版本管理,所以lib包升级比较复杂)

三、问题描述及解决办法

1.JDK版本需要1.7及以上

2.提升Jar包版本(不仅限于截图,根据使用选择性增删)

在这里插入图片描述
不仅限于截图,根据使用选择性增删lib包,并且建议先升级截图最下面五个包及freemarker.jar,javassist.jar,删除xwork-core的包(2.5版本struts2已经引入了此包),然后再根据使用情况和项目启动情况增加引入其他包。
在文末jar包资源已经打包上传到资源库了,如果没有积分也可以去maven仓库自己对应先下载

3.StrutsFilter及StrutsPrepareAndExecuteFilter包路径迁移问题

定义在web.xml中的部分使用ng.filter包下的过滤器需要迁移
<filter>
	<filter-name>struts2</filter-name>
	<!--原路径为org.apache.struts2.dispatcher.ng.filter.StrutsFilter-->
	<filter-class>org.apache.struts2.dispatcher.filter.StrutsFilter</filter-class>
</filter>
<filter>
	<filter-name>StrutsPrepareAndExecuteFilter</filter-name>
	<!--原路径为org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter-->
	<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>

另外,在我升级中发现我们框架包重写了StrutsFilter和StrutsPrepareAndExecuteFilter,并且框架包引用了ng.filter包下的部分类,由于框架包不维护了,不能重新编译框架包。导致启动报错。
我的解决办法是,在项目中新建相同包路径,将StrutsFilter复制一份,并将java中使用ng下的包,修改为引入最新版本,这样项目在启动的时候本地的StrutsFilter由于路径相同会覆盖框架的包,就完成了替换。

4.struts.xml 文件修改

<!-- 1.truts2从2.5版本开始,为了提升安全性,默认开启了严格的方法调用。 如果要使用通配符*,必须在package中设置 strict-method-invocation="false"  -->
	<package name="default" extends="struts-global" strict-method-invocation="false">
		<!-- 2.针对使用通配符,也可以主动开启动态方法调用,加上全局方法允许访问,如果1不适用,选择本方式试一试 -->
		<global-allowed-methods>regex:.*</global-allowed-methods>
	</package>

修改所有struts配置文件的头部版本,修改至2.5

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
    "http://struts.apache.org/dtds/struts-2.5.dtd">

5.本地项目的国际化(根据项目是否需要选择升级)

由于我们自己做了本地的国际化,低版本使用的国际化是在StrutsFilter中初始化

LocalizedTextUtil.clearDefaultResourceBundles();
LocalizedTextUtil.addDefaultResourceBundle(MyResource.class.getName());

但是在高版本的struts中取消了LocalizedTextUtil,这里找到了替换的方法

// 在struts2.xml中引入:
<bean type="com.opensymphony.xwork2.LocalizedTextProvider"
		  name="myProvider"
		  class="com.xxx.xxx.web.text.MyLocalizedTextProvider"
		  scope="singleton" />
	<constant name="struts.localizedTextProvider" value="myProvider" />
// 新建MyLocalizedTextProvider类:
public class MyLocalizedTextProvider extends StrutsLocalizedTextProvider {
    public MyLocalizedTextProvider() {
        super();
        this.addDefaultResourceBundle(MyResource.class.getName());
    }
}

6. convention.annotation.Result.name()(Found data of type calss java.lang.String[index])

升级后的@Result注解,name属性由String变更为String[],且在项目中,使用地方特别多,所以需要一次项目的重新编译。

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface Result {
    // 此处由String name 改为String[] name所以需要重新编译所有使用@Result注解的类
    String[] name() default {"success"};
    String location() default "";
    String type() default "";
    String[] params() default {};
}

7.com.opensymphony.xwork2.ActionContext;

ActionContext中的getParameters()返回参数由Map修改为HttpParameters (根据项目实际情况选择性修改,我的项目没有遇到此问题)

// 新版本返回参数是HttpParameters
  public HttpParameters getParameters() {
        return (HttpParameters)this.get("com.opensymphony.xwork2.ActionContext.parameters");
  }

8. < constant name=“struts.locale” value=“zh_CN” />

项目原来配置在struts.xml中的 <constant name=“struts.locale” value=“zh-CN” />属性是zh-CN(连接号不是下划线),另外commons-lang3-3.8.1.jar中加载国际化时的方法已经修改,导致加载属性就报错,解决办法是value=“zh_CN” 修改为下划线。

9.struts标签问题修改

// 原版本
<s:url id="url" action="login">
<s:set id="str1" value="'string1 value'" />
<s:bean id="bean" name="beanName">
<s:iterator value="tradeList" id="trade" status="status"> 
<s:set name="myCode" value=" *** "/>
<s:property escape="true" var="someProperty"/>
//新版本
<s:url var="url" action="login">
<s:bean var="bean" name="beanName">
<s:iterator  var="trade" value="tradeList" status="status">
<s:set var="myCode" value=" *** "/>
<s:property escapeHtml="true" var="someProperty"/>

看看页面操作这几个标签的方法是否用到属性取值,对应取值方式是否需要修改

10.自定义标签的*.ftl文件找不到

原因:高版本的struts2移除了部分.ftl,例如我使用的div.ftl,div-close.ftl。
解决办法:在下载低版本的struts2的包,用war解压jar包,找到需要的ftl文件,将文件手动拷贝到项目的WebContent\template\jquery目录下(具体目录看控制台提示,提示那个文件夹缺失就手动新建放到新建文件夹)

总结

  • 先升级Struts2必要的几个核心包,然后根据升级后的版本和项目其他组件使用情况,升级和增删其他的包,逐步解决问题。
  • 根据自己项目实际的启动反馈,进行问题的解决,大部分问题都是可以百度到,其中自己项目特殊化需求可以用重写覆盖等发放解决。
  • 最后部署到测试环境测一测功能

参考及资源下载

参考博客:
这两篇博客也包含一些我升级没有遇到的问题及解决办法
https://blog.youkuaiyun.com/moxiaofan123/article/details/115510962
https://blog.youkuaiyun.com/weixin_41271981/article/details/111642705
资源下载:
https://download.youkuaiyun.com/download/sinat_36743893/85291095

antlr-2.7.2.jar, aopalliance-1.0.jar, asm-3.3.jar, asm-commons-3.3.jar, asm-tree-3.3.jar, builder-0.6.2.jar, classworlds-1.1.jar, commons-beanutils-1.8.0.jar, commons-chain-1.2.jar, commons-collections-3.2.2.jar, commons-digester-2.0.jar, commons-fileupload-1.3.2.jar, commons-io-2.2.jar, commons-lang-2.4.jar, commons-lang3-3.2.jar, commons-logging-1.1.3.jar, commons-validator-1.3.1.jar, core-0.6.2.jar, dwr-1.1.1.jar, ezmorph-1.0.6.jar, freemarker-2.3.22.jar, google-collections-1.0.jar, google-gxp-0.2.4-beta.jar, guava-r09.jar, jackson-core-asl-1.9.2.jar, jackson-mapper-asl-1.9.2.jar, javassist-3.11.0.GA.jar, jcl-over-slf4j-1.5.8.jar, json-lib-2.3-jdk15.jar, juli-6.0.18.jar, mvel2-2.0.11.jar, ognl-3.0.19.jar, org.apache.felix.framework-4.0.3.jar, org.apache.felix.main-4.0.3.jar, org.apache.felix.shell-1.4.3.jar, org.apache.felix.shell.tui-1.4.1.jar, org.osgi.compendium-4.0.0.jar, org.osgi.core-4.1.0.jar, oro-2.0.8.jar, oval-1.31.jar, plexus-container-default-1.0-alpha-10.jar, plexus-utils-1.2.jar, sitemesh-2.4.2.jar, slf4j-api-1.7.12.jar, spring-aop-3.0.5.RELEASE.jar, spring-asm-3.0.5.RELEASE.jar, spring-beans-3.0.5.RELEASE.jar, spring-context-3.0.5.RELEASE.jar, spring-core-3.0.5.RELEASE.jar, spring-expression-3.0.5.RELEASE.jar, spring-test-3.0.5.RELEASE.jar, spring-web-3.0.5.RELEASE.jar, struts-core-1.3.10.jar, struts2-cdi-plugin-2.3.30.jar, struts2-codebehind-plugin-2.3.30.jar, struts2-config-browser-plugin-2.3.30.jar, struts2-convention-plugin-2.3.30.jar, struts2-core-2.3.30.jar, struts2-dojo-plugin-2.3.30.jar, struts2-dwr-plugin-2.3.30.jar, struts2-embeddedjsp-plugin-2.3.30.jar, struts2-gxp-plugin-2.3.30.jar, struts2-jasperreports-plugin-2.3.30.jar, struts2-javatemplates-plugin-2.3.30.jar, struts2-jfreechart-plugin-2.3.30.jar, struts2-jsf-plugin-2.3.30.jar, struts2-json-plugin-2.3.30.jar, struts2-junit-plugin-2.3.30.jar, struts2-osgi-admin-bundle-2.3.30.jar, struts2-osgi-demo-bundle-2.3.30.jar, struts2-osgi-plugin-2.3.30.jar, struts2-oval-plugin-2.3.30.jar, strut
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <constant name="struts.devMode" value="true" /> <package name="default" namespace="/" extends="struts-default"> <action name="helloworld" class="com.mytest.HelloWorldAction"> <result> /result.jsp </result> </action> </package> <package name="LoginForm" extends="struts-default"> <action name="login" class="com.mytest.LoginAction" method="execute"> <result> /login.jsp </result> </action> </package> </struts> <!--1.使用 struts2.5.16 版本 2.lib 文件夹下放置:工程所需jar包 3.xml标签库为远程获取,路径:http://struts.apache.org/dtds/struts-2.5.dtd 可设置为本地【xml输入语法快捷提示】,就不用远程获取了:window-->preference-->输入Catalog-->xml下的Catalog-->Add-->location:解压缩struts-core-2.5.16.jar 后,文件struts-2.5.dtd文件路径。 4.设置开发者模式: <constant name="struts.devMode" value="true" /> <constant name="struts.i18n.encoding" value="utf-8" /> 每次HTTP请求系统都重新加载资源文件,有助于开发 5.struts配置文件改动后,是否重新加载 <constant name="struts.configuration.xml.reload" value="true" /> 6.查看源码:Build path 后的类库中,奶瓶图标找到struts-core-2.5.16.jar 右键-->properties-->java Source Attachment-->External location :源码路径 7.查看文档API:Build path 后的类库中,奶瓶图标找到struts-core-2.5.16.jar 右键-->properties-->javadoc location :输入网址 或选择源码DOC目录 8.拦截器:web.xml 配置拦截器<filter> struts2.5的filter-class 与struts2.5以前版本有所不同 <!-- 浏览器访问 http://localhost:8080/MyWeb/helloworld --> --> <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>Struts 2</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- 配置核心拦截器 --> <filter> <filter-name>struts2</filter-name> <!-- Filter的实现类 struts2.5 --> <filter-class> org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <!-- 拦截所有的url --> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值