struts2.5.16版本升级

这次struts2版本升级,也是因为要修复安全漏洞CVE-2018-1327。在旧版本升级新版本的过程中,遇到了不少问题,在这里记录一下。

struts2.5.16版本下载链接:http://mirrors.hust.edu.cn/apache/struts/2.5.16/struts-2.5.16-all.zip

jackson-dataformat-xml-2.1.2.jar下载链接:http://repo1.maven.org/maven2/com/fasterxml/jackson/dataformat/jackson-dataformat-xml/2.1.2/jackson-dataformat-xml-2.1.2.jar

1.架包替换

struts2升级到2.5.16版本,大概需要替换更新的架包如下:

struts2-core-2.5.16.jar、struts2-json-plugin-2.5.16.jar、log4j-api-2.10.0.jar、xstream-1.4.10.jar、commons-io-2.5.jar、commons-lang3-3.6.jar

commons-fileupload-1.3.3.jar、freemarker-2.3.26-incubating.jar、javassist-3.20.0-GA.jar、jackson-annotations-2.9.0.jar、jackson-core-2.9.4.jar

jackson-databind-2.9.4.jar、jackson-dataformat-xml-2.1.2.jar、struts2-rest-plugin-2.5.16.jar

删掉xwork-core-2.3.28.1.jar

其他jar请根据自己的工程补充。


2.新的类StrutsPrepareAndExecuteFilter

在原来的web.xml中,我们指定了filterstruts2的处理类,这个类在新的架包中,路径发生了变化:

旧:org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

新:org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter

所以需要更新web.xml


3.index方法找不到

在老版本struts中,action如果不写方法名称,或者请求不指定特定的方法,struts就会默认调用execute方法。但是在新版本中,rest架包的RestActionMapper指定了默认的方法是index。就会出现错误

get方法报错Wrong method was defined as an action method:index

post方法报错Wrong method was defined as an action method:create


这个错误可在struts.properties中添加两个配置项解决

struts.mapper.indexMethodName=execute

struts.mapper.postMethodName=execute



4.方法不被允许

如果url中带有方法名,如index.action!getList,在struts2.5.16中,会报错误Method xxx for action xxx is not allowed!


需要在struts.xml中,设置所有方法都被允许


global-allowed-methods在package中的位置必须是在所有action之前,在所有其他global之后,不然就会报错

需要注意的是global-allowed-methods这个属性只在同一个package中起作用


5.新的action映射关系

在struts2.5.16中,struts2会读取namespace并做匹配。

如果你的url是多层的,如:/aaa/bbb

在老版本的struts中可能不需要定义action”bbb”的namespace就可以正常使用

但是在新版本中,如果你的action没有定义namespace,action定义成"bbb",struts2会将aaa当做action去做匹配,找不到就报错误,但是又不提示你是哪个action。

所以需要加上一个namespace=“/aaa”。


6.json类型数据处理

如果使用了rest架包,可能会导致json数据异常。

在rest架包中,默认json数据是由JacksonLibHandler类(struts2-rest-plugin-2.5.16.jar)处理的

而不使用rest的架包的时候,json数据,是由JSONResult类(struts2-json-plugin-2.3.28.1.jar)处理的。

JSONResult会自动从ACTION类中取出变量构造成json数据

这个变量是sturts自动选取的,选取判断依据暂时没有弄清楚,

或许我们可以通过在<result type="json"><paramname="root">变量名</param></result>进行人为指定,

这个可以试一下看是否生效。)

为了在rest中让json数据重新由JSONResult处理,我们需要将json类型的处理类手动指定为HtmlHandler。

我们需要修改两个文件

struts.xml 增加一个bean=“myJson”的配置,class指定为org.apache.struts2.rest.handler.HtmlHandler


struts.properties 配置struts.rest.handlerOverride.json=myJson,struts.rest.content.restrictToGET=false


7.action配置中的method属性没有用

在action中指定了调用的method,但是实际上调用的还是index或者execute。

在com.opensymphony.xwork2.DefaultActionProxy中找到代码

可以看出,当method不为空的的时候,不会将action中配置的method传递过来

所以,而从url中生成的这个method,又是默认生成的,所以,我们需要将默认的method设置为空


8.标签属性更新

在struts2.5版本中,iterator标签属性id,set标签属性var、name,append标签属性id等都被移除。

但是因为程序已经发布出去,要修改我们自己的jsp,涉及的改动比较大,最好还是让struts2兼容一下旧版本。

所以,我们可以通过修改struts-tags.tld文件来恢复支持兼容。

要修改的文件有两个:

struts-core-2.5.16.jar/META-INF/struts-tags.tld

a)append新增一个name="id"的attribute

b)iterator新增一个name="id"的attribute

c)set新增一个name="id"的attribute,一个name="name"的attribute,set还要将name="var"的required修改为false

反编译struts-core-2.5.16.jar中的org.apache.struts2.views.jsp.ContextBeanTag,增加方法setId


以上为转载

这里本人碰到的问题:多加了struts2-rest-plugin-2.5.16.jar这个jar包,导致永远404.

(因为我的jar包是直接从示例项目中copy过去的)


参考:https://blog.csdn.net/weixin_38167954/article/details/80049097

https://blog.csdn.net/qq_24059599/article/details/51986761