天天看點

Struts2由2.3.16.3更新為2.5.20引發的問題及解決辦法

近期,項目在阿裡雲平台部署後,發現有struts2存在安全漏洞。公司使用的struts2版本為2.3.16.3,于是決定更新到2.5.20以解決這個問題。

在更新到2.5.20之後,産生了一系列的問題,在查閱各種資料之後,問題得以一一解決,現在把遇到的問題及解決方法總結一下,友善以後查閱。

項目是用maven建構,struts2更新到2.5.20需要替換的pom依賴:

新依賴:

<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-core</artifactId>
    <version>2.5.20</version>
 </dependency>

<dependency>

    <groupId>org.apache.struts</groupId>

    <artifactId>struts2-spring-plugin</artifactId>

    <version>2.5.20</version>

</dependency>

<dependency>

    <groupId>org.apache.struts</groupId>

    <artifactId>struts2-json-plugin</artifactId>

    <version>2.5.20</version>

</dependency>

<dependency>

    <groupId>org.apache.struts</groupId>

    <artifactId>struts2-convention-plugin</artifactId>

    <version>2.5.20</version>

</dependency>

<dependency>

    <groupId>org.apache.struts</groupId>

    <artifactId>struts2-config-browser-plugin</artifactId>

    <version>2.5.20</version>

</dependency>

<dependency>

    <groupId>com.jgeppert.struts2.jquery</groupId>

    <artifactId>struts2-jquery-plugin</artifactId>

    <version>3.7.1</version>

</dependency>

<dependency>

    <groupId>com.jgeppert.struts2.jquery</groupId>

    <artifactId>struts2-jquery-grid-plugin</artifactId>

    <version>3.7.1</version>

</dependency>

<dependency>

    <groupId>org.apache.struts</groupId>

    <artifactId>struts2-dojo-plugin</artifactId>

    <version>2.3.37</version>

    <exclusions>

        <exclusion>

            <groupId>org.apache.struts</groupId>

            <artifactId>struts2-core</artifactId>

        </exclusion>

    </exclusions>

</dependency>
 <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.2.5</version>
</dependency>
           
舊的依賴(需要被替換掉的):
           
<dependency>
         <groupId>org.apache.struts</groupId>
         <artifactId>struts2-core</artifactId>
         <version>2.3.16.3</version>
         <exclusions>
         <exclusion>
           <groupId>javassist</groupId>
           <artifactId>javassist</artifactId>
         </exclusion>
  </exclusions>
</dependency>
<dependency>
         <groupId>org.apache.struts</groupId>
         <artifactId>struts2-spring-plugin</artifactId>
         <version>2.3.16.3</version>
</dependency>
<dependency>
         <groupId>org.apache.struts</groupId>
         <artifactId>struts2-json-plugin</artifactId>
         <version>2.3.16.3</version>
</dependency>
<dependency>
         <groupId>org.apache.struts</groupId>
         <artifactId>struts2-convention-plugin</artifactId>
         <version>2.3.16.3</version>
</dependency>
<dependency>
         <groupId>org.apache.struts</groupId>
         <artifactId>struts2-config-browser-plugin</artifactId>
         <version>2.3.16.3</version>
</dependency>
<dependency>
         <groupId>com.jgeppert.struts2.jquery</groupId>
         <artifactId>struts2-jquery-plugin</artifactId>
         <version>3.7.1</version>
</dependency>
<dependency>
         <groupId>com.jgeppert.struts2.jquery</groupId>
         <artifactId>struts2-jquery-grid-plugin</artifactId>
         <version>3.7.1</version>
</dependency>
<dependency>
         <groupId>org.apache.struts</groupId>
         <artifactId>struts2-dojo-plugin</artifactId>
         <version>2.3.16.3</version>
</dependency>
<dependency>
         <groupId>asm</groupId>
         <artifactId>asm</artifactId>
         <version>3.3.1</version>
</dependency>
 <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>2.2.2</version>
 </dependency>
                
           

其他的依賴jar是通過傳遞依賴方式導入進來的,比如asm,asm版本需要更新到5.2,在這裡通過傳遞依賴導入的。接下來就是開始解決各種問題了。

問題1.java.lang.ClassNotFoundException:org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuterFilter

原因:struts2更新到2.5之後,StrutsPrepareAndExecuterFilter被移到了org.apache.struts2.dispatcher.filter包下面。

解決辦法:

修改web.xml的配置:

舊配置:

<filter>

         <filter-name>struts2</filter-name>

         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

</filter>

<filter-mapping>

         <filter-name>struts2</filter-name>

         <url-pattern>/*</url-pattern>

</filter-mapping>
           

将上面的配置修改成下面的配置,

新配置:        

<filter>

                   <filter-name>struts2</filter-name>

                   <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>

         </filter>

         <filter-mapping>

                   <filter-name>struts2</filter-name>

                   <url-pattern>/*</url-pattern>

         </filter-mapping>
           

問題2. Attribute escape invalid for tag property according to TLD異常錯誤

原因:struts2.5将property标簽的escape屬性删除了,新增了escapeJavaScript
           
,escapeCsv,escapeXml,escapeHtml。
           
解決方法:
           
使用escapeJavaScript,escapeCsv,escapeXml,escapeHtml代替escape屬性。
           
原因:struts2.5将iterator标簽的id屬性取消了,使用var來代替。
           
解決方法:
           
iterator表達式中的id換成var即可。
           
原因:ValidationAware類被移到com.opensymphony.xwork2.interceptor包下。
           
解決方法:
           
com.opensymphony.xwork2.ValidationAware類改成com.opensymphony.xwork2.interceptor.ValidationAware。
           
問題5:
           
原因:asm3.3.1中org.objectweb.asm.ClassVisitor是一個接口,asm5.2中org.objectweb.asm.ClassVisitor是一個抽象類,最初的時候忘記更新asm版本了。
           
解決辦法:asm更新到5.2即可解決問題。