struts2改springmvc过程中问题及解决办法记录

简介:

我们目前的系统中使用了struts2框架,该版本是2.3.32,但近期Apache struts发布了一项struts的安全漏洞说明,具体如下:

Apache Struts2 远程代码执行漏洞(S2-048)
发布日期:2017年7月7日

CVE ID:CVE-2017-9791

受影响的版本:

Apache Struts Version: 2.3.x

不受影响的版本:

Apache Struts Version:2.5.10.1

综述:

2017年7月7日,Apache Struts发布最新的安全公告,Apache Struts2的Struts1插件存在远程代码执行的高危漏洞,漏洞编号为CVE-2017-9791(S2-048)。攻击者可以构造恶意的字段值通过Struts2的Struts1的插件,远程执行代码。
相关链接如下:
https://cwiki.apache.org/confluence/display/WW/S2-048

规避方案

  1. 关闭Showcase插件。
  2. 受影响的用户可以升级到2.5.10.1版本。
  3. 开发者通过使用resource keys替代将原始消息直接传递给ActionMessage的方式。 如下所示:
    messages.add("msg", new ActionMessage("struts1.gangsterAdded", gform.getName()));

不要使用如下的方式:
messages.add("msg", new ActionMessage("Gangster " + gform.getName() + " was added"));

  1. 在非必要的情况下禁用struts2-struts1-plugin插件。将struts2-struts1-plugin-2.3.x.jar文件从 “/WEB-INF/lib”目录中移动到其他文件夹或者删除。

根据apache struts的安全漏洞说明,我们的struts版本刚好是这次说的有问题的版本,因此需要根据官方建议升级为2.5.10.1。
但是综合项目实际情况后发现,升级到2.5.10.1的struts2后,官方的规范说明明确指出需要使用jdk7以上版本:
1

因此,若要升级struts2,则必须同时升级目前项目中jdk6版本到jdk7。
考虑到项目实际情况,发现如上述的方式改动,升级jdk6到jdk7后,出现的问题将会更大,因此分析研究后决定直接把struts2的框架替换为spring mvc,在解决本次问题的同时,向目前更主流的框架靠拢。

在整个改造过程中问题诸多,以下是部分问题及解决办法记录,供以后参考:

1、改造之前,尝试运行原来的项目,其中有两个项目mobileFront和mobileFrontQuery,在把两个项目都加入到同一个tomcat的时候报错,提示如下:

Could not publish server configuration for Tomcat v7.0 at localhost.
Multiple Contexts have a path of "/mobileFront".

意思是要部署名为mobileFront的项目,但是现在已经存在了一个。
原因是mobileFront和mobileFontQuery的部署名称都是mobileFront,在同一个tomca中部署两个相同部署名称的项目是不被允许的。
解决办法是更改其中任意一个的部署名称,使其不冲突,具体更改过程如下:

右键项目--》 选择properties --》 点击web project settings --》把context root后的名称改为要部署的新名称 --》

打开工作空间,也就是项目文件的存储目录,找到要更改的项目 --》打开.settings文件夹 --》 用编辑器打开org.eclipse.wst.common.component文件 --》把文件中原本项目相关的名称都改为新的项目部署名并保存 --》重启eclipse。

2、依次配置完web.xml,applicationcontext.xml和springmvc.xml,并在controller类以及相应方法中加入相应注解后启动项目,抛出如下异常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'MMarketAction1': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.huateng.mmarket.service.MMarketService

意思是创建MMarketAction1这个bean失败,因为autowire无法注入MMarketService。
原因是在配置web.xml文件时少了一个spring的监听器:

<listener>  
    <description>spring监听器</description>  
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  </listener>

在web.xml中加入此监听器,再次启动tomcat则不再跑出上述异常。

3、启动tomca时抛出异常:

java.lang.NoSuchMethodError: org.springframework.web.bind.annotation.RequestMapping.consumes()[Ljava/lang/String;

意思是在requestMapping的方法不存在,这个是使用@RequestMapping注解生成url是抛出异常。
原因是在项目中同时存在了两个spring-web的jar包,一个3.0.5版本,一个3.1.1版本,这两个包中都有这个类,包名一样,导致走到这里无法确定该用哪个,最终找不到。
解决办法是去掉3.0.5的jar包,重启tomca后正常。

4、启动tomcat没有抛出异常,但是访问项目时始终提示404,最终发现在tomcat的项目部署路径下的WEB-INF中没有web.xml文件,也就是说这个项目并没有成功部署到tomcat中。
原因是在build path中少了webapp的引入,导致部署的时候并没有扫描webapp下的文件,原本build中如下:
2

解决办法是在build中加入webapp的文件夹,加入后如下:
3

然后clean之后重启tomcat,可正常访问。

5、有同事在正常启动tomcat之后,却无法正常访问,原因是部署名并不是项目名,而他使用项目名称访问,自然就一直是404。解决办法是把部署名称换成项目名称,或者使用实际部署名称访问。

6、struts的action类更改为spring mvc的controller,原struts2情况下,所有action都继承了ActionSupport,并在struts.xml中进行了类似下边的配置:

<action name="rcvSpdbPage" class="com.RcvSpdbPageAction"
method="receive"></action>

name定义url,class定义url对应的具体类,method定义入口方法。
改为springmvc后,去掉对ActionSupport的继承,去掉struts.xml的配置,取代的是在类名上加@controller注解以及在方法上加@RequestMapping注解。
还有一种情况是,需要返回jsp页面,原struts中配置如下:

<action name="rcvSPDBReceive" class="com.RcvSpdbAction"
    method="receive">
   <result name="signPage">/CmuSpdbResultSign.jsp</result>
</action>

改为springmvc后,除开上一中无返回值一样的改法外,还需要更改方法的返回值为ModelAndView
同时在代码中return “signPage”的地方,改为

return new ModelAndView("/CmuSpdbResultSign.jsp");
目录
相关文章
|
3月前
|
XML JSON Java
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
本文介绍了如何使用IntelliJ IDEA和Maven搭建一个整合了Struts2、Spring4、Hibernate4的J2EE项目,并配置了项目目录结构、web.xml、welcome.jsp以及多个JSP页面,用于刷新和学习传统的SSH框架。
90 0
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
|
3月前
|
Java Spring Maven
Struts 2遇见Spring:这个组合如何颠覆你的Web开发?
【8月更文挑战第31天】在现代Web开发中,Struts 2与Spring的结合使用能显著增强应用的模块化和可维护性。本文将介绍如何整合这两个框架,并提供代码示例。首先,在`pom.xml`中添加Struts 2和Spring的依赖,然后在`struts.xml`中配置Struts 2以识别Spring插件。接着,在Spring配置文件中定义bean,并在Struts 2的Action类中使用`@Autowired`注解进行自动注入。
50 0
|
3月前
|
Java 开发者 前端开发
Struts 2、Spring MVC、Play Framework 上演巅峰之战,Web 开发的未来何去何从?
【8月更文挑战第31天】在Web应用开发中,Struts 2框架因强大功能和灵活配置备受青睐,但开发者常遇配置错误、类型转换失败、标签属性设置不当及异常处理等问题。本文通过实例解析常见难题与解决方案,如配置文件中遗漏`result`元素致页面跳转失败、日期格式不匹配需自定义转换器、`&lt;s:checkbox&gt;`标签缺少`label`属性致显示不全及Action中未捕获异常影响用户体验等,助您有效应对挑战。
89 0
|
5月前
|
XML Java Apache
必知的技术知识:HHS整合(Struts2+Spring+Hibernate)
必知的技术知识:HHS整合(Struts2+Spring+Hibernate)
38 0
|
Java API Spring
Struts2【整合Spring】
Struts2【整合Spring】
138 0
Struts2【整合Spring】
|
XML 前端开发 Java
Spring与Struts2的整合案例及XML配置的具体使用(四)
Spring与Struts2的整合案例及XML配置的具体使用(四)
400 0
Spring与Struts2的整合案例及XML配置的具体使用(四)
|
开发框架 Java 数据库连接
Struts2+Spring+Hibernate整合步骤
Struts2+Spring+Hibernate是J2EE的最新流行框架。本篇是我搭建这个框架的经验总结。 本方案采用自底向上:Hibernate——>Spring——>Struts2的方式进行整合。具体步骤如下: 1.通过MyEclipse向导,导入实现Hibernate3.2功能:生成会话工厂和hibernate.cfg.xml文件。然后在src中添加log4j.properties文件。 2.通过MyEclipse向导,导入实现Spring2.5功能,生成applicationContext.xml文件。然后将Spring2.0 AOP Liberaries里的asm2.2.3.jar包
172 0
|
前端开发 Java 数据库连接
Spring、Struts2优点分析以及Spring MVC、Struts2优点比较
  Spring 及其优点   大部分项目都少不了Spring的身影,为什么大家对他如此青睐,而且对他的追捧丝毫没有减退之势呢Spring是什么:Spring是一个轻量级的DI和AOP容器框架。说它轻量级有一大部分原因是相对与EJB的(虽然本人从没有接触过EJB的应用),重要的是,Spring是非侵入式的,基于spring开发的应用一般不依赖于spring的类。DI:称作依赖注入(Dependency Injection),和控制反转一个概念,具体的讲,当一个角色需要另外一个角色协助的时候,在传统的程序设计中,通常有调用者来创建被调用者的实例。但是在spring中创建被调用者将不再有调用者完
177 0
|
Java 网络安全 Apache
spring+hibernate+struts2零配置整合
  说句实话,很久都没使用SSH开发项目了,但是出于各种原因,再次记录一下整合方式,纯注解零配置。 一。前期准备工作 gradle配置文件: group 'com.bdqn.lyrk.ssh.
1542 0
|
Web App开发 Java Apache
Struts2与Spring整合
前言 本博文主要讲解Spring怎么与Struts2框架整合... Struts2和Spring的整合关键点: action对象交给Spring来创建 搭建环境 进入jar包 引入jar文件: 1)引入struts .
1375 0
下一篇
无影云桌面