Struts2 を 2.5.30 にアップグレードする際に発生するいくつかの問題とその解決策
開発
2023-06-25 09:44:45
訪問数: null
1. 背景
- Struts2 にはリモート実行の脆弱性が存在したため、これを解決するには 2.5.30 にアップグレードする必要があります。
- プログラムで現在使用されている struts2-core のバージョンは 2.3.32、spring のバージョンは 2.5.6、commons-lang3 のバージョンは 3.1、jdk のバージョンは 1.6 です。
- Maven プロジェクト管理
2、解決策
- Struts2-core パッケージのバージョンをアップグレードし、jdk バージョンをアップグレードし、Spring バージョンをアップグレードします。
- Struts2-coreパッケージのバージョンをアップグレードし、jdkのバージョンをアップグレードします
3. 解決プロセス
- まず、pom ファイル内の Struts2-core パッケージのバージョンを 2.5.30 にアップグレードし、簡単なコンパイルを実行して変更を確認します。その結果、プログラムはエラー actionContext.getParameters() を報告します。バージョン アップグレード後、オブジェクト タイプが Map から に変更されました
。後続のプログラムのロジックへの影響を避けるために、HttpParameters はメソッド toMap() の新しいバージョンを通じてマップを取得し、HttpParameters.create().buildNoNestedWrapping() の新しいバージョンを呼び出すことができます。充填時の方法 Map parmeters = actionContext.getParameters().toMap();
actionContext.setParameters(HttpParameters.create(parmeters).buildNoNestedWrapping());
- プログラムを変更した後、コンパイルして渡し、jdk1.6 を使用してプログラムを起動すると、エラーが報告されていることがわかります。Baidu でソース コードをチェックして、jdk バージョン 1.7 以降であることを確認します。
java.lang.UnsupportedClassVersionError: org/apache/lucene/store/Directory :
Unsupported major.minor version 51.0
- JDK バージョンを 1.8 にアップグレードすると、対応する Spring バージョンもアップグレードする必要があります。アップグレードしないとエラーが報告され、Spring の現在の JDK バージョンはアノテーションをサポートしません。
[org.springframework.context.annotation.ComponentScanBeanDefinitionParser]
are only available on JDK 1.5 and higher
- pom ファイル内の spring 関連のバージョンを 4.3.29.RELEASE に変更してコンパイルします。今回報告されたエラーはひどいものです。たとえば、spring-jdbc は新しいバージョンで大幅に変更され、多くのメソッドが放棄されており、プログラム内にdaoレベル関連のプログラムが多すぎる 短時間では修正できず、リスクが高すぎるため、ブログ – リンク を参考に、srcフォルダーに org.springframework.core パッケージを追加し、 JdkVersion.java ファイルを追加して、アノテーションが jdk8 を識別できるようにし、Spring バージョンのアップグレードによって生じるリスクとトラブルを置き換えます。
- jdk8互換バージョンの設定を追加した後、プログラムを再度起動してエラーを見つけます
Dispatcher initialization failed java.lang.RuntimeException:
java.lang.reflect.InvocationTargetException
web.xml の Struts フィルターのクラス アドレスが変更されたため、ng ディレクトリを削除するために変更する必要があります。
- 変更後、再度エラーを開始します。エラーが commons.lang3 パッケージに関連していることを確認します。mavenTree を確認して、明らかな競合があることを確認します。Struts2-core パッケージの commons.lang3 のバージョンが 3.8 であることを確認します。 .1
com.opensymphony.xwork2.inject.ContainerImpl$ConstructorInjector
File: ContainerImpl.javaMethod: constructLine: 425 -
com/opensymphony/xwork2/inject/ContainerImpl.java:425:-1Caused by:
Caused by: java.lang.NoSuchMethodError:
org.apache.commons.lang3.text.StrSubstitutor.setValueDelimiter(Ljava/lang/String;)Lorg/apache/commons/lang3/text/StrSubstitutor;
at com.opensymphony.xwork2.config.providers.EnvsValueSubstitutor.<init>(EnvsValueSubstitutor.java:35)
- pom ファイル commons.lang3 のバージョンを 3.8.1 に変更し、コンパイルして再起動し、エラー ActionContext.getParameters()Ljava/util/Map; NoSuchMethodError を報告します。この getParameters() の問題は手順 1 で解決されています。それはコンパイル中に報告されたエラーであるはずです はい、それはこのメソッドが私が書いたコードから来ていないことを意味します エラー メッセージによると、参照された jar が古いバージョンの Struts2 と getParameters() を使用していることがわかりましたメソッドが呼び出されます。操作中にこれを呼び出しています。メソッドに問題があり、対応する jar パッケージが変更されました
- jdk8を再起動しても問題なく、プログラムは正常に実行できます。
3、解決予定
- プログラムをローカルで起動して実行できますが、オンラインではまだ試していません。解決する必要がある jdk1.6 から 1.8 までのいくつかの落とし穴がまだあるかもしれません。たとえば、jvm はバージョンで大幅に変更されており、関連するパラメータの調整を考慮する必要があります。
転載: blog.csdn.net/weixin_43288999/article/details/124328422