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

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

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包下的过滤器需要迁移
<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中的 属性是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.csdn.net/moxiaofan123/article/details/115510962
https://blog.csdn.net/weixin_41271981/article/details/111642705
资源下载:
https://download.csdn.net/download/sinat_36743893/85291095

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/870456.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存