JDK8环境中使用struts2的步骤详解

网友投稿 437 2023-01-19


JDK8环境中使用struts2的步骤详解

背景

Struts是Apache基金组织中Jakarta项目组的一个开源(Open Source)项目,主要就是实现了MVC设计模式,在Struts中有自己的控制器(ActionServlet),同时也提供了各种常用的页面标签库以减少jsP页面中的Scriptlet代码,Struts实际上就属于在传统技术上发展起来的一种新的应用模式,其操作的本质依然还是JSP、Servlet、javaBean等技术的应用,Struts的体系结构图如下。

最近将组内项目的部署环境进行了一次升级。将JDK1.7S升级为1.8,Resin替换为Tomcat。在升级替换的过程中遇到了一些问题。特记录再次,希望能帮助有同样需求的朋友。

Struts2 和 JDK8

项http://目中使用的Struts2版本是2.3.35。

org.apache.struts

struts2-core

2.3.35

Struts2里面依赖xwork-core

org.apache.struts.xwork

xwork-core

2.3.35

xwork-core依赖asm-*

问题来了!

低版本的ASM不能在JDK1.8环境中使用。如果强行使用,会导致一些奇怪的问题。

例如:

只有一部分Action类可以正常被Struts2加载并处理http请求。某些在JDK1.7环境下可以正常工作的Action不能在JDK1.8下使用。原来可以访问的接口,现在是404。

具体问题出在:

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官方提供的一个插件。具体用法如下:

在项目中加入依赖:

org.apache.struts

struts2-java8-support-plugin

2.3.35

排除ASM依赖

org.apache.struts.xwork

xwork-core

uJUQNtyasm

asm

asm

asm-commons

Struts2 版本升级问题

标签库不兼容

众所周知,Struts2框架的安全问题很多,建议升级到最新版本2.5.x。

但是2.5.x版本的Struts2提供的标签库和低版本的不兼容。这就会导致原有的JSP页面不能正常渲染。

当然了,如果你的项目里面没有使用Struts2替换的标签,这个问题可以忽略了。

核心类拦截器变化

struts2

org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter

struts2

/*

aspectjweaver

我们项目使用的版本是:

org.aspectj

aspectjweaver

1.6.9

升级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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:实现接口管理平台(接口管理系统)
下一篇:Java判断字符串是否含有乱码实例代码
相关文章

 发表评论

暂时没有评论,来抢沙发吧~