JDK8環(huán)境中使用struts2的步驟詳解
背景
Struts是Apache基金組織中Jakarta項目組的一個開源(Open Source)項目,主要就是實(shí)現(xiàn)了MVC設(shè)計模式,在Struts中有自己的控制器(ActionServlet),同時也提供了各種常用的頁面標(biāo)簽庫以減少JSP頁面中的Scriptlet代碼,Struts實(shí)際上就屬于在傳統(tǒng)技術(shù)上發(fā)展起來的一種新的應(yīng)用模式,其操作的本質(zhì)依然還是JSP、Servlet、JavaBean等技術(shù)的應(yīng)用,Struts的體系結(jié)構(gòu)圖如下。

最近將組內(nèi)項目的部署環(huán)境進(jìn)行了一次升級。將JDK1.7S升級為1.8,Resin替換為Tomcat。在升級替換的過程中遇到了一些問題。特記錄再次,希望能幫助有同樣需求的朋友。
Struts2 和 JDK8
項目中使用的Struts2版本是2.3.35。
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.35</version> </dependency>
Struts2里面依賴xwork-core
<dependency> <groupId>org.apache.struts.xwork</groupId> <artifactId>xwork-core</artifactId> <version>2.3.35</version> </dependency>
xwork-core依賴asm-*
問題來了!
低版本的ASM不能在JDK1.8環(huán)境中使用。如果強(qiáng)行使用,會導(dǎo)致一些奇怪的問題。
例如:
只有一部分Action類可以正常被Struts2加載并處理http請求。某些在JDK1.7環(huán)境下可以正常工作的Action不能在JDK1.8下使用。原來可以訪問的接口,現(xiàn)在是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);
}
}
這部分代碼就因?yàn)槭褂昧说桶姹镜腁SM導(dǎo)致類解析失敗(IndexOutOfBoundsException)。
解決辦法一
最簡單方便的解決版本就是升級Struts2的版本到2.5.x。新版本將xwork依賴直接合并到struts2-core中了。而且使用了ASM 5.X版本,支持JDK8。
解決辦法二
使用Struts2官方提供的一個插件。具體用法如下:
在項目中加入依賴:
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-java8-support-plugin</artifactId> <version>2.3.35</version> </dependency>
排除ASM依賴
<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 版本升級問題
標(biāo)簽庫不兼容
眾所周知,Struts2框架的安全問題很多,建議升級到最新版本2.5.x。
但是2.5.x版本的Struts2提供的標(biāo)簽庫和低版本的不兼容。這就會導(dǎo)致原有的JSP頁面不能正常渲染。
當(dāng)然了,如果你的項目里面沒有使用Struts2替換的標(biāo)簽,這個問題可以忽略了。
核心類攔截器變化
<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
我們項目使用的版本是:
<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
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
判斷以逗號分隔的字符串中是否包含某個數(shù)的實(shí)例
下面小編就為大家?guī)硪黄袛嘁远禾柗指舻淖址惺欠癜硞€數(shù)的實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11
java 之JNA中的Memory和Pointer的使用方法
這篇文章主要介紹了java 之JNA中的Memory和Pointer的使用方法,文章基于Java的相關(guān)自來哦展開對Pointer和Memory的使用介紹,需要的小伙伴可以參考一下2022-04-04
IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 創(chuàng)建多模塊項目的超詳細(xì)教程
這篇文章主要介紹了IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 創(chuàng)建多模塊項目的教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09
SpringBoot項目啟動錯誤:找不到或無法加載主類的幾種解決方法
本文主要介紹了SpringBoot項目啟動錯誤:找不到或無法加載主類的幾種解決方法,具有一定的參考價值,感興趣的可以了解一下2025-03-03
java微信公眾號開發(fā)第一步 公眾號接入和access_token管理
這篇文章主要為大家介紹了java微信公眾號開發(fā),主要內(nèi)容包括公眾號接入和access_token管理,感興趣的小伙伴們可以參考一下2016-01-01
Java BigDecimal使用及基本運(yùn)算(推薦)
Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數(shù)進(jìn)行精確的運(yùn)算。這篇文章主要介紹了Java BigDecimal使用指南針(推薦),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
Java中Spring技巧之?dāng)U展點(diǎn)的應(yīng)用
這篇文章主要介紹了Java中Spring技巧之?dāng)U展點(diǎn)的應(yīng)用,下文Spring容器的啟動流程圖展開其內(nèi)容的相關(guān)資料,具有一定的參考價值,需要的小伙伴可以參考一下2022-04-04

