背景
struts是apache基金组织中jakarta项目组的一个开源(open source)项目,主要就是实现了mvc设计模式,在struts中有自己的控制器(actionservlet),同时也提供了各种常用的页面标签库以减少jsp页面中的scriptlet代码,struts实际上就属于在传统技术上发展起来的一种新的应用模式,其操作的本质依然还是jsp、servlet、javabean等技术的应用,struts的体系结构图如下。
最近将组内项目的部署环境进行了一次升级。将jdk1.7s升级为1.8,resin替换为tomcat。在升级替换的过程中遇到了一些问题。特记录再次,希望能帮助有同样需求的朋友。
struts2 和 jdk8
项目中使用的struts2版本是2.3.35。
1
2
3
4
5
|
<dependency> <groupid>org.apache.struts</groupid> <artifactid>struts2-core</artifactid> <version> 2.3 . 35 </version> </dependency> |
struts2里面依赖xwork-core
1
2
3
4
5
|
<dependency> <groupid>org.apache.struts.xwork</groupid> <artifactid>xwork-core</artifactid> <version> 2.3 . 35 </version> </dependency> |
xwork-core依赖asm-*
问题来了!
低版本的asm不能在jdk1.8环境中使用。如果强行使用,会导致一些奇怪的问题。
例如:
只有一部分action类可以正常被struts2加载并处理http请求。某些在jdk1.7环境下可以正常工作的action不能在jdk1.8下使用。原来可以访问的接口,现在是404。
具体问题出在:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
private void readclassdef(string classname) { if (!classname.endswith( ".class" )) { classname = classname.replace( '.' , '/' ) + ".class" ; } try { url resource = classloaderinterface.getresource(classname); if (resource != null ) { inputstream in = resource.openstream(); try { classreader classreader = new classreader(in); classreader.accept( new infobuildingvisitor( this ), classreader.skip_debug); } finally { in.close(); } } else { throw new xworkexception( "could not load " + classname); } } catch (ioexception e) { throw new xworkexception( "could not load " + classname, e); } } |
这部分代码就因为使用了低版本的asm导致类解析失败(indexoutofboundsexception)。
解决办法一
最简单方便的解决版本就是升级struts2的版本到2.5.x。新版本将xwork依赖直接合并到struts2-core中了。而且使用了asm 5.x版本,支持jdk8。
解决办法二
使用struts2官方提供的一个插件。具体用法如下:
在项目中加入依赖:
1
2
3
4
5
|
<dependency> <groupid>org.apache.struts</groupid> <artifactid>struts2-java8-support-plugin</artifactid> <version> 2.3 . 35 </version> </dependency> |
排除asm依赖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<dependency> <groupid>org.apache.struts.xwork</groupid> <artifactid>xwork-core</artifactid> <exclusions> <exclusion> <groupid>asm</groupid> <artifactid>asm</artifactid> </exclusion> <exclusion> <groupid>asm</groupid> <artifactid>asm-commons</artifactid> </exclusion> </exclusions> </dependency> |
struts2 版本升级问题
标签库不兼容
众所周知,struts2框架的安全问题很多,建议升级到最新版本2.5.x。
但是2.5.x版本的struts2提供的标签库和低版本的不兼容。这就会导致原有的jsp页面不能正常渲染。
当然了,如果你的项目里面没有使用struts2替换的标签,这个问题可以忽略了。
核心类拦截器变化
1
2
3
4
5
6
7
8
9
10
11
|
<filter> <filter-name>struts2</filter-name> <filter- class >org.apache.struts2.dispatcher.filter.strutsprepareandexecutefilter</filter- class > <!-- org.apache.struts2.dispatcher.ng.filter.strutsprepareandexecutefilter 之前的核心过滤器全类名会有个ng ,struts2. 5 核心过滤器没有这个 --> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
aspectjweaver
我们项目使用的版本是:
1
2
3
4
5
|
<dependency> <groupid>org.aspectj</groupid> <artifactid>aspectjweaver</artifactid> <version> 1.6 . 9 </version> </dependency> |
升级jdk1.8以后,需要同时升级该jar的版本到1.8.13。
参考
- Struts2.5配置
- Java 8 Support Plugin
- Struts+2.3+to+2.5+migration
- what-is-the-difference-between-struts-2-3-x-and-struts-2-5-x
- ASM-VERSIONS
- Struts2最新RCE漏洞S2-057
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:https://leokongwq.github.io/2018/11/07/struts2-with-jdk8.html