Struts2 を 2.5.30 にアップグレードする際に発生するいくつかの問題とその解決策

1. 背景

  1. Struts2 にはリモート実行の脆弱性が存在したため、これを解決するには 2.5.30 にアップグレードする必要があります。
  2. プログラムで現在使用されている struts2-core のバージョンは 2.3.32、spring のバージョンは 2.5.6、commons-lang3 のバージョンは 3.1、jdk のバージョンは 1.6 です。
  3. Maven プロジェクト管理

2、解決策

  1. Struts2-core パッケージのバージョンをアップグレードし、jdk バージョンをアップグレードし、Spring バージョンをアップグレードします。
  2. Struts2-coreパッケージのバージョンをアップグレードし、jdkのバージョンをアップグレードします

3. 解決プロセス

  1. まず、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());
    
  2. プログラムを変更した後、コンパイルして渡し、jdk1.6 を使用してプログラムを起動すると、エラーが報告されていることがわかります。Baidu でソース コードをチェックして、jdk バージョン 1.7 以降であることを確認します。
      java.lang.UnsupportedClassVersionError: org/apache/lucene/store/Directory :
       Unsupported major.minor version 51.0
    
    ここに画像の説明を挿入
  3. JDK バージョンを 1.8 にアップグレードすると、対応する Spring バージョンもアップグレードする必要があります。アップグレードしないとエラーが報告され、Spring の現在の JDK バージョンはアノテーションをサポートしません。
        [org.springframework.context.annotation.ComponentScanBeanDefinitionParser]
         are only available on JDK 1.5 and higher  
    
  4. pom ファイル内の spring 関連のバージョンを 4.3.29.RELEASE に変更してコンパイルします。今回報告されたエラーはひどいものです。たとえば、spring-jdbc は新しいバージョンで大幅に変更され、多くのメソッドが放棄されており、プログラム内にdaoレベル関連のプログラムが多すぎる 短時間では修正できず、リスクが高すぎるため、ブログ – リンク を参考に、srcフォルダーに org.springframework.core パッケージを追加、 JdkVersion.java ファイルを追加して、アノテーションが jdk8 を識別できるようにし、Spring バージョンのアップグレードによって生じるリスクとトラブルを置き換えます。
  5. jdk8互換バージョンの設定を追加した後、プログラムを再度起動してエラーを見つけます
       Dispatcher initialization failed java.lang.RuntimeException:
       java.lang.reflect.InvocationTargetException
    
    web.xml の Struts フィルターのクラス アドレスが変更されたため、ng ディレクトリを削除するために変更する必要があります。
    ここに画像の説明を挿入
  6. 変更後、再度エラーを開始します。エラーが 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)
    
  7. pom ファイル commons.lang3 のバージョンを 3.8.1 に変更し、コンパイルして再起動し、エラー ActionContext.getParameters()Ljava/util/Map; NoSuchMethodError を報告します。この getParameters() の問題は手順 1 で解決されています。それはコンパイル中に報告されたエラーであるはずです はい、それはこのメソッドが私が書いたコードから来ていないことを意味します エラー メッセージによると、参照された jar が古いバージョンの Struts2 と getParameters() を使用していることがわかりましたメソッドが呼び出されます。操作中にこれを呼び出しています。メソッドに問題があり、対応する jar パッケージが変更されました
  8. jdk8を再起動しても問題なく、プログラムは正常に実行できます。

3、解決予定

  1. プログラムをローカルで起動して実行できますが、オンラインではまだ試していません。解決する必要がある jdk1.6 から 1.8 までのいくつかの落とし穴がまだあるかもしれません。たとえば、jvm はバージョンで大幅に変更されており、関連するパラメータの調整を考慮する必要があります。

おすすめ

転載: blog.csdn.net/weixin_43288999/article/details/124328422