IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Struts2升级到2.5.30,问题解决及过程记录 -> 正文阅读

[Java知识库]Struts2升级到2.5.30,问题解决及过程记录

Struts2升级到2.5.30


前言

由于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中的 <constant name=“struts.locale” value=“zh-CN” />属性是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

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-07 11:02:36  更:2022-05-07 11:05:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:41:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码