[Struts 2.3 Upgrading Issue]Struts2.0因安全漏洞升级到2.3的操作手册和遇到的问题

本文详细介绍了从Struts2.0升级到Struts2.3的过程,包括更新jar文件、更新Servlet过滤器、创建struts.xml文件、关闭开发模式、提高log4j级别以及解决Spring代理调度job时I18N资源文件无法取到值的问题。重点突出了Struts2.3升级中遇到的常见问题及其解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[u][i]Struts 2.3 Upgrading Issue[/i][/u]
[b][i]版本升级原因:struts2.0漏洞[/i][/b]
[url]http://struts.apache.org/download.cgi#struts221[/url]
[url]http://struts.apache.org/release/2.3.x/docs/s2-014.html[/url]

[i][b]升级方法和问题:[/b][/i]
[color=olive][url]https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=30743764[/url]
[url]http://bbs.youkuaiyun.com/topics/390598510[/url][/color]
[url]http://stackoverflow.com/questions/11543959/struts-2-3-upgrading-ognl-issue[/url]

[b]Step 1 - 更新Struts 2的jar文件到Class Path[/b]
【Struts2.0的jar依赖包】
asm.jar
commons-fileupload-1.2.1.jar
commons-io-1.3.2.jar
freemarker-2.3.8.jar
ognl-2.6.11.jar
struts2-core-2.0.14.jar
xwork-2.0.7.jar
commons-lang-2.5.jar(保留)

【Struts2.3的jar依赖包】
工具:maven、jar_search等
我们添加Struts 2最小需求的jar包。我们将把这些jar包拷贝到WEB-INF\lib这个文件夹中。
找到并拷贝这些文件
asm-3.3.jar
asm-commons-3.3.jar
asm-tree-3.3.jar
commons-fileupload-1.3.1.jar
commons-io-2.2.jar
commons-lang3-3.1.jar
freemarker-2.3.19.jar
ognl-3.0.6.jar
struts2-core-2.3.16.3.jar
xwork-core-2.3.16.3.jar


[b]Step 2 - 更新Struts 2 Servlet Filter[/b]
【truts2.0的servlet过滤器】

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
<url-pattern>*.jsp</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>

【struts2.3的servlet过滤器】
为了要Struts 2 框架在你的web应用中工作,你需要在web.xml文件中添加Servlet Filter类和Filter mappingr。下面是你要添加的内容。

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



[b]Step 3 - 创建struts.xml文件[/b]
【打开DMI】
2.3+默认DMI是关闭的,动态方法调用官方推荐的做法是,使用通配符的形式,因可能存在安全隐患:
<constant name="struts.enable.DynamicMethodInvocation" value="true" />

否则总是跳转到default action execute中或报错:TTP Status 404 - There is no Action mapped for namespace [/] and action name [login!login.action] associated with context path [/]

[b]Step 4 - 关闭开发模式[/b]
struts.xml :
<constant name="struts.devMode" value="false" />

否则表单提交时action中没有bean的set方法就会报错如:
http://localhost/login!login.action?test=2
Error setting expression 'test' with value ['2', ]
或者给每个提交的properties在action中添加bean和get/set方法。

[b]Step 5 - 提高log4j级别[/b]
log4j.properties :
#The problem is that the page including the inventory search has several other fields 
#which are not related to the inventory search (and do not have a getter/settter
#in the inventorySearch action). Under Struts 2.0, these extra fields are ignored
#by the inventorySearch action. However, Struts 2.3 throws the above exception
#when these extra fields are posted with the form.
log4j.logger.com.opensymphony.xwork2=ERROR


否则报类似错误:
[STDOUT] WARN [com.opensymphony.xwork2.ognl.OgnlValueStack] - CommonsLogger.warn(60) | Error setting expression 'nonInventoryRelatedField' with value '[Ljava.lang.String;@833d35'
ognl.OgnlException: target is null for setProperty(null, "9", [Ljava.lang.String;@833d35)


[b]Step 6 - Spring代理调度job时I18N资源文件无法取到值[/b]
系统管理>任务管理 通过页面按钮action手动启动调度job是可以取到资源文件的内容的,可以正常跑该任务。
但spring代理调度该job时无法取得properties的资源文件,struts2.3出现此问题,struts2.0的版本没问题。
BagProcessJob.java L55
String job_cd = this.baseAction.getRes("job.cd.bag") ;

BaseAction.java:524
return ResourceBundle.getBundle(APP, this.getLocale()).getString(key);
Locale com.opensymphony.xwork2.ActionSupport.getLocale() = null
解决方案:
/**
* 重写方法:取得I18N国际化资源文件用Locale对象。
* 【原因】通过页面按钮action手动启动调度job是可以取到资源文件的内容的,可以正常跑该任务。
* 但spring代理调度该job时无法取得properties的资源文件,struts2.3出现此问题,struts2.0的版本没问题。
* com.opensymphony.xwork2.ActionSupport.getLocale() = null
* 【方式】手动创建中文 Locale,Action上下文生效时替换真实browser的locale
*
* add by jeffen@pactera at 20140718
* @return
*/
public Locale getLocale(){
Locale l = new Locale("zh_CN", "CN");
ActionContext ctx = ActionContext.getContext();
if (ctx != null && ctx.getLocale() != null) {
l = ctx.getLocale();
}
return l;
}


[b]Step 7 - s:debug标签无效需要Jetty容器支持[/b]
Struts2.3.16 s:debug新特性:<s:debug/> tag was improved and now works properly under Jetty, see WW-4223
[url]http://www.kankanews.com/ICkengine/archives/89289.shtml[/url]
否则报错,org.apache.jasper.JasperException: An exception occurred processing JSP
ognl/ObjectPropertyAccessor.java
ognl.NoSuchPropertyException:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值