这次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.xml3.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中起作用
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