天天看点

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即可解决问题。