栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

Struts2升级到2.5.30

文章目录
  • Struts2升级到2.5.30
  • 前言
  • 一、Struts2远程漏洞描述
  • 二、本机环境描述
  • 三、问题描述及解决办法
    • 1.JDK版本需要1.7及以上
    • 2.提升Jar包版本(不仅限于截图,根据使用选择性增删)
    • 3.StrutsFilter及StrutsPrepareAndExecuteFilter包路径迁移问题
    • 4.struts.xml 文件修改
    • 5.本地项目的国际化(根据项目是否需要选择升级)
    • 6. convention.annotation.Result.name()(Found data of type calss java.lang.String[index])
    • 7.com.opensymphony.xwork2.ActionContext;
    • 8. < constant name="struts.locale" value="zh_CN" />
    • 9.struts标签问题修改
    • 10.自定义标签的*.ftl文件找不到
  • 总结
  • 参考及资源下载


前言

由于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包下的过滤器需要迁移

	struts2
	
	org.apache.struts2.dispatcher.filter.StrutsFilter


	StrutsPrepareAndExecuteFilter
	
	org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter

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

4.struts.xml 文件修改

	
		
		regex:.*
	

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



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

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

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

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

// 在struts2.xml中引入:

	
// 新建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中的 属性是zh-CN(连接号不是下划线),另外commons-lang3-3.8.1.jar中加载国际化时的方法已经修改,导致加载属性就报错,解决办法是value=“zh_CN” 修改为下划线。

9.struts标签问题修改
// 原版本



 


//新版本






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

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

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

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/860342.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号