近期,项目在阿里云平台部署后,发现有struts2存在安全漏洞。公司使用的struts2版本为2.3.16.3,于是决定升级到2.5.20以解决这个问题。
在升级到2.5.20之后,产生了一系列的问题,在查阅各种资料之后,问题得以一一解决,现在把遇到的问题及解决方法总结一下,方便以后查阅。
项目是用maven构建,struts2升级到2.5.20需要替换的pom依赖:
新依赖:
org.apache.struts
struts2-core
2.5.20
org.apache.struts
struts2-spring-plugin
2.5.20
org.apache.struts
struts2-json-plugin
2.5.20
org.apache.struts
struts2-convention-plugin
2.5.20
org.apache.struts
struts2-config-browser-plugin
2.5.20
com.jgeppert.struts2.jquery
struts2-jquery-plugin
3.7.1
com.jgeppert.struts2.jquery
struts2-jquery-grid-plugin
3.7.1
org.apache.struts
struts2-dojo-plugin
2.3.37
org.apache.struts
struts2-core
cglib
cglib
3.2.5
旧的依赖(需要被替换掉的):
org.apache.struts
struts2-core
2.3.16.3
javassist
javassist
org.apache.struts
struts2-spring-plugin
2.3.16.3
org.apache.struts
struts2-json-plugin
2.3.16.3
org.apache.struts
struts2-convention-plugin
2.3.16.3
org.apache.struts
struts2-config-browser-plugin
2.3.16.3
com.jgeppert.struts2.jquery
struts2-jquery-plugin
3.7.1
com.jgeppert.struts2.jquery
struts2-jquery-grid-plugin
3.7.1
org.apache.struts
struts2-dojo-plugin
2.3.16.3
asm
asm
3.3.1
cglib
cglib
2.2.2
其他的依赖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的配置:
旧配置:
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
将上面的配置修改成下面的配置,
新配置:
struts2
org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
struts2
/*
问题2. Attribute escape invalid for tag property according to TLD异常错误
原因:struts2.5将property标签的escape属性删除了,新增了escapeJavaScript
,escapeCsv,escapeXml,escapeHtml。
解决方法:
使用escapeJavaScript,escapeCsv,escapeXml,escapeHtml代替escape属性。
问题3:Attribute [id] invalid for tag [iterator] according to TLD
原因:struts2.5将iterator标签的id属性取消了,使用var来代替。
解决方法:
iterator表达式中的id换成var即可。
问题4: java.lang.ClassNotFoundException:com.opensymphony.xwork2.ValidationAware
原因:ValidationAware类被移到com.opensymphony.xwork2.interceptor包下。
解决方法:
com.opensymphony.xwork2.ValidationAware类改成com.opensymphony.xwork2.interceptor.ValidationAware。
问题5:
java.lang.IncompatibleClassChangeError: class org.apache.struts2.convention.DefaultClassFinder$InfoBuildingVisitor has interface org.objectweb.asm.ClassVisitor as super class
原因:asm3.3.1中org.objectweb.asm.ClassVisitor是一个接口,asm5.2中org.objectweb.asm.ClassVisitor是一个抽象类,最初的时候忘记升级asm版本了。
解决办法:asm升级到5.2即可解决问题。