- 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
二、本机环境描述三、问题描述及解决办法 1.JDK版本需要1.7及以上 2.提升Jar包版本(不仅限于截图,根据使用选择性增删)JDK版本:1.8
Spring版本:5.3.10
手动版本管理(未使用Maven版本管理,所以lib包升级比较复杂)
不仅限于截图,根据使用选择性增删lib包,并且建议先升级截图最下面五个包及freemarker.jar,javassist.jar,删除xwork-core的包(2.5版本struts2已经引入了此包),然后再根据使用情况和项目启动情况增加引入其他包。
在文末jar包资源已经打包上传到资源库了,如果没有积分也可以去maven仓库自己对应先下载
定义在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由于路径相同会覆盖框架的包,就完成了替换。
<!-- 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中的
// 原版本
<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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)