因为老版本的struts2被爆出存在安全问题,所以公司以前的几个老项目要求将所有的strut2升级到最新版,目前我看到官网的最新版本是2.5.2,因为这些老项目没有使用Maven,所以在升级的过程中可以说是踩了不少坑的。这个升级成功了,下一个项目又会出现些奇怪的问题,所以,我把升级的完整过程给大家列出来,希望能够帮助到大家,如果觉得有用的话,欢迎留言,转载请注明出处!
好!话不多说,进入正题
第一步:首先从struts 官网下载最新的struts 依赖包
https://struts.apache.org/
第二步:替换jar包
因为我使用的是svn,而且项目升级好以后还没有提交,这里可以很直观的看出jar包的变化,绿色部分为需要替换的jar包
还有一个需要删除的包:
xwork-core-2.3.16.3.jar 这个包需要删除,最新版stuts-core包里面集成了该jar包
第三步:修改web.xml
老版本的
org.apache.struts2.dispatcher.gn.filter.StrutsPrepareAndExecuteFilter
改为新版本的
org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
第四步:修改struts.xml
1.将原本的头部改成新版本的头部信息:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
3.package后面加一个strict-method-invocation=“false”
strict-method-invocation="false"
4.方法不被允许
如果url中带有方法名,如index.action!getList,在struts2.5.2中,会报错误Method xxx for action xxx is not allowed!然后出现404的情况
<global-allowed-methods>regex:.*</global-allowed-methods>
注意:这条语句必须放在package里面的最后一行,不然报错
第五步:修改struts.property文件,在里面将默认方法指定为execute
struts.mapper.indexMethodName=execute
struts.mapper.postMethodName=execute
第六步:修改代码
IDEA里面全局搜索:
public class JakartaMultiPartRequest implements MultiPartRequest
@Override
public void cleanUp() {
}
2.修改getFile方法
因为新版里面的getFile的返回值类型由File[ ] 变成了UploadFile[ ] 所以,我们把原有的getFile方法注释掉,重新写这个方法
具体代码如下:
public UploadedFile[] getFile(String fieldName) {
List<FileItem> items = files.get(fieldName);
if (items == null) {
return null;
}
List<UploadedFile> fileList = new ArrayList<>(items.size());
for (FileItem fileItem : items) {
File storeLocation = ((DiskFileItem) fileItem).getStoreLocation();
if (fileItem.isInMemory() && storeLocation != null && !storeLocation.exists()) {
try {
storeLocation.createNewFile();
} catch (IOException e) {
LOG.error("Cannot write uploaded empty file to disk: {}", storeLocation.getAbsolutePath(), e);
}
}
fileList.add(new StrutsUploadedFile(storeLocation));
}
return fileList.toArray(new UploadedFile[fileList.size()]);
}
好了,那么到此为止,你就可以重新启动你的项目了!