近期,項目在阿裡雲平台部署後,發現有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即可解決問題。