Struts2框架优缺点
- 格式:doc
- 大小:714.00 KB
- 文档页数:33
1.strust2框架来历简介:WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的J2EE Web框架。
(同时也是一个成熟的基于Web的MVC框架)MVC:Model View Controller,model是模型,view是视图,controller是控制器,是一种框架模式。
随着WebWork框架的发展,衍生出了strust2框架,因此strust2框架是WebWork的升级,而不是一个全新的框架,因此稳点性、性能等方面都有很好的保证,而且也同时吸收了struts1框架和WebWork俩者的优点.所以strust2框架也是一个基于Web的MVC框架注意:strust2框架并不是struts1框架的延续或者升级,俩者有着很大的不同2.web项目中的三层架构(和MVC是俩个完全不同的架构)1.表示层(Struts2框架就是工作在这个地方)2.业务逻辑层(service层,处理业务逻辑,比如判断用户名是否存在、密码是否正确、权限是否拥有、账号是否被冻结、账号是否异常、用户积分是否到达操作要求等等,多为一些执行某一个操作条件的判断)3.数据访问层(dao层,专门处理和数据库进行交换的事情,jdbc/hibernate就在这里使用)在项目中,这些不同的分层的表现形式,其实就是在我们自己建的不同的package 中写上各自分层中所使用的java类.比如在项目中我们建了三个package,三个package中java类的作用分别为表示层的代码、业务逻辑层代码、数据访问层代码。
注意:可以理解为,MVC架构是这里说描述的三层架构的一部分,即:三层架构中的表示层可以使用mvc架构的框架来实现,例如使用struts2框架.3.使用struts2框架的好处(为什么要使用struts2框架)减少编程人员代码的编写,使代码更加简洁明了,缩短开发时间,增加开发效率.4.struts2框架引入到web项目中首先使用Eclipse/MyEclipse中建一个web项目.1.把struts2相关jar包引入到项目中。
Struts,Spring,Hibernate优缺点1.strutsstruts框架具有组件的模块化,灵活性和重用性的优点,同时简化了基于MVC的web应用程序的开发。
优点:Struts跟Tomcat、Turbine等诸多Apache项目一样,是开源软件,这是它的一大优点。
使开发者能更深入的了解其内部实现机制。
除此之外,Struts的优点主要集中体现在两个方面:Taglib和页面导航。
Taglib是Struts的标记库,灵活动用,能大大提高开发效率。
另外,就目前国内的JSP开发者而言,除了使用JSP自带的常用标记外,很少开发自己的标记,或许Struts是一个很好的起点。
关于页面导航,我认为那将是今后的一个发展方向,事实上,这样做,使系统的脉络更加清晰。
通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。
尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。
另外,struts是业界"标准"(很多成功案例),学习资源丰富,HTML标签非常优秀缺点:Taglib是Struts的一大优势,但对于初学者而言,却需要一个持续学习的过程,甚至还会打乱你网页编写的习惯,但是,当你习惯了它时,你会觉得它真的很棒。
Struts将MVC的Controller一分为三,在获得结构更加清晰的同时,也增加了系统的复杂度。
ActionForms使用不便、无法进行单元测试(StrutsTestCase只能用于集成)Struts跟Tomcat、Turbine等诸多Apache项目一样,是开源软件,这是它的一大优点。
使开发者能更深入的了解其内部实现机制。
Struts开放源码框架的创建是为了使开发者在构建基于Java Servlet和JavaServer Pages(JSP)技术的Web应用时更加容易。
Struts框架为开放者提供了一个统一的标准框架,通过使用Struts作为基础,开发者能够更专注于应用程序的商业逻辑。
struts1与struts2的区别Struts作为MVC 2的Web框架,自推出以来不断受到开发者的追捧,得到广泛的应用。
作为最成功的Web框架,Struts自然拥有众多的优点:MVC 2模型的使用、功能齐全的标签库(Tag Library)、开放源代码。
但是,正所谓“没有最好,只有更好”,Struts1.x自身也有不少的缺点:需要编写的代码过多,容易引起“类爆炸”、单元测试困难。
这些缺点随着Web的发展越来越明显。
这就促生了Struts 2,它的诞生能很好的解决上述问题。
在本文中,笔者将对Struts2和Struts1.x这两种框架进行详细的比较。
比较将涉及到这两种框架的Action、验证、类型转换及如何开发等方面的内容。
希望通过这样的比较,让读者了解这两种框架各自的特点,以便于在自己的项目中,根据实际情况,尽快的过渡到Struts2的时代。
本文的内容基于Struts2.0.6。
一、引言Struts的第一个版本是在2001年5月份发布的。
它的最初设想是通过结合JSP和Servlet,使Web应用的视图和业务/应用逻辑得以清晰地分离开来。
在Struts之前,最常见的做法是在JSP中加入业务和应用逻辑,或者在Servlet中通过println()来生成视图。
自从第一版发布以来,Struts实际上已成为业界公认的Web应用标准。
它的炙手可热也为自己带来了改进和变更,所以不但要跟上对Web应用框架不断变化的需求,而且要与日渐增多竞争激烈的众多框架的特性相融合。
到最后,产生了几个下一代Struts的解决方案。
其中两个最受瞩目的方案是Shale和Struts Ti。
Shale是一个基于构件的框架,并在最近成为Apache的顶级项目。
而Struts Ti则是在Struts的成功经验基础上继续坚持对前端控制器(Front Controller)和MVC(model-view-controller)模式进行改进。
Struts1与struts2的区别总结1,背景:Struts2并不是struts1的升级版,两者没有太大的关系,struts2是继承了webwork的机制,吸收了struts2和webwork的有优势。
Struts2是基于WebWork的一个全新框架. Struts2主要改进是取代了Struts1的Servlet和Action. Struts2的核心框架是当作一个filter来实现其功能的,而Struts1是ActionServlet.然后在Action上,Struts1都少不了要传递Request等参数,还要继承Action父类,而Struts2只要实现了一个public String execute()就可以了,这样Action就可以实现脱离Servlet 测试. Struts2还提供了拦截器(Interceptot)等Struts1所没有的技术.2,Action类Struts1要求action继承一个抽象基类,而struts2既可以继承类又可以实现action对应的接口,即接口编程,可以实现多个接口,使得可选和订制服务成为可能。
3,线程模式Struts1中的action是单例模式,会涉及到线程安全问题,因为仅有一个action来处理所有的请求,而struts2则是非单例模式,每个请求对应一个action,这样就不用考虑线程安全的问题(而且,servlet容器会给每个请求产生可丢弃的对象,这样就不会导致性能和垃圾回收问题)。
4,可测性Struts1中的action有个主要的问题是execute方法暴露了servlet API,这使得测试等需要依赖servlet容器。
一个第三方扩展--struts TestCase--提供了一套struts模拟对象来进行测试;而struts2 中的action可以通过初始化和设置属性(例如action当中直接用get和set方法),调用方法来测试,“依赖式注入”注入也使得测试更容易5,servlet依赖Struts1中的action依赖于servlet API,因为当一个action被调用时,HttpServletRequest和HttpServletResponse对象会被传递给execute方法(请求和响应的对象需要依赖于execute方法,即servlet API);而struts2中的action则不需要依赖于servlet容器,允许action脱离容器单独被测试(例如:struts2中获取请求的对象可以用ServletActionContext.getRequest())。
struts2框架特征Struts2框架特征Struts2是一种流行的Java Web应用程序开发框架,其特征使其成为许多开发者的首选。
本文将介绍Struts2框架的特征,包括MVC 架构、强大的标签库、拦截器、数据验证、国际化支持以及灵活的配置等。
一、MVC架构Struts2采用了MVC(Model-View-Controller)架构,将应用程序的业务逻辑、数据模型和用户界面分离。
这种架构使开发者能够更好地组织代码、提高代码的可维护性,并能够更容易地进行代码重用和测试。
在Struts2中,Model代表数据模型,可以是POJO(Plain Old Java Object)或者是与数据库交互的实体类;View代表用户界面,通常是JSP页面;Controller则负责处理用户请求、调用业务逻辑,并将处理结果返回给用户。
二、强大的标签库Struts2提供了丰富的标签库,使开发者能够更轻松地构建用户界面。
这些标签库包括表单标签、数据展示标签、控制流标签等,可以大大简化页面开发的工作量。
例如,开发者可以使用Struts2的表单标签库来生成表单,并自动处理表单的数据绑定、验证和错误提示。
这样,开发者无需手动编写大量的HTML和JavaScript代码,能够更快速地完成表单开发。
三、拦截器Struts2的拦截器是其核心特性之一,可用于在请求到达Controller之前和之后执行一些通用的处理逻辑,如日志记录、权限验证、异常处理等。
开发者可以通过配置拦截器栈,将多个拦截器按照特定的顺序组合起来,实现复杂的请求处理流程。
拦截器的使用使得开发者能够将通用的处理逻辑从业务逻辑中分离出来,提高了代码的可维护性和重用性。
同时,Struts2还提供了许多内置的拦截器,如参数封装拦截器、文件上传拦截器等,方便开发者处理不同类型的请求。
四、数据验证在Web应用程序中,数据验证是一项重要的任务。
Struts2提供了强大的数据验证机制,开发者可以通过简单的配置实现对表单数据的验证。
Struts2基础知识Struts2概述1.Struts2框架应用javaee三层结构中的web层框架。
2.Struts2框架在struts1和webwork基础之上发展的全新框架。
3.Struts2所解决的问题:在以往实现一个功能时,都需要写很多的servlet,从而造成后期维护上的不方便。
图解:4.现在比较稳定的Struts2版本struts-2.3.24-all.zip5.web层常见框架1.struts2.springMVCStruts2框架入门1.导入jar包1.在lib里面有jar包,但不能全部导入,因为里面含有一些spring包,是不能使用的,导入会导致程序不能运行。
2.到app目录里面复制案例的jar包是最好的方法。
2.创建action3.配置action类的访问路径1.创建struts2核心配置文件,该核心配置文件位置和名称是固定的,位置必须在src下面,名称为struts.xml 。
2.引入dtd约束,可以在案例文件中找到,复制在struts.xml文件中即可。
3.action的配置*注意访问路径:http://域名/端口号/项目名/action名.action注意:.action可以省略,但建议不要省略,为了兼容一些老版本的浏览器。
4.配置Struts2的过滤器,可以在案例中的web.xml文件中找到,复制粘贴即可。
Struts2执行过程图解:Struts2配置1.是一种常量标签2.修改Struts2的默认常量值1.常用方式在struts.xml中进行配置。
2.其它两种方式1.在src下面创建struts.properties文件并修改。
2.在web.xml文件中进行修改。
3.Struts2最常用的常量struts.il8n.encoding=UTF-8,解决表单在通过post方式提交中文时,中文乱码的问题。
Struts2笔记(一)可使用全局页面。
1、配置方法:在package标签下配置2、注意:该标签只能在一个package标签中使用,如果有多个标签,需要重新定义。
struts2常见面试题Introduction:Struts2是一种用于开发Java Web应用程序的开源Web应用框架。
在软件工程领域,Struts2常常是面试中的热门话题。
本文将介绍一些常见的Struts2面试题,并提供详细解答和示例。
Question 1: 什么是Struts2框架?它的主要特点是什么?Struts2是一个基于MVC设计模式的Web应用框架。
它通过集成多个核心组件(如拦截器、过滤器、表单验证等)提供了一套丰富的功能,用于简化开发和管理Java Web应用程序。
Struts2的主要特点包括:1. 松耦合:Struts2使用基于配置的方式来管理组件之间的依赖关系,降低了模块之间的耦合。
2. 灵活性:开发人员可以根据自己的需求进行扩展和定制,以适应不同的项目需求。
3. 可测试性:Struts2的组件松耦合特点使得单元测试变得容易,并且可以方便地模拟用户请求进行测试。
Question 2: Struts2的核心组件有哪些?Struts2的核心组件包括:1. Action:处理用户请求的核心组件,负责接收请求并执行相应的业务逻辑。
2. Interceptor:用于对请求进行预处理和后处理的拦截器组件。
3. Result:负责生成响应结果,可以是页面视图或其他格式的数据(如JSON、XML等)。
4. FilterDispatcher:负责将请求分发给合适的Action处理。
5. ValueStack:用于存储Action处理的结果数据,支持OGNL表达式以便于数据的访问和操作。
Question 3: 如何定义一个Struts2的Action?在Struts2中,可以通过以下几种方式来定义一个Action:1. 实现Action接口:通过实现Action接口,并提供相应的业务方法来处理请求。
2. 继承ActionSupport类:ActionSupport是一个提供了一些方便方法的抽象类,可以直接继承并实现自己的业务逻辑。
struts2.Struts2课件1Mvc与servlet1.1 Servlet的优点1、是mvc的基础,其他的框架⽐如struts1,struts2,webwork都是从servlet基础上发展过来的。
所以掌握servlet是掌握mvc的关键。
2、Servlet把最底层的api暴漏给程序员,使程序员更能清楚的了解mvc的各个特点。
3、程序员可以对servlet进⾏封装。
Struts2就是从servlet中封装以后得到的结果。
4、市场上任何⼀个mvc的框架都是servlet发展过来的,所以要想学好struts2这个框架,了解servlet的运⾏机制很关键。
1.2 Servlet的缺点1、每写⼀个servlet在web.xml中都要做相应的配置。
如果有多很servlet,会导致web.xml内容过于繁多。
2、这样的结构不利于分组开发。
3、在servlet中,doGet⽅法和doPost⽅法有HttpServletRequest和HttpServletResponse参数。
这两个参数与容器相关,如果想在servlet中作单元测试,则必须初始化这两个参数。
4、如果⼀个servlet中有很多个⽅法,则必须采⽤传递参数的形式,分解到每⼀个⽅法中。
2重构servlet针对servlet以上的特点,我们可以对servlet进⾏重构,使其开发起来更简单。
更容易,更适合团队协作。
重构的⽬标:1、只写⼀个serlvet或者过滤器,我们这⾥选择过滤器。
2、不⽤再写任何的servlet,这样在web.xml中写的代码就很少了。
3、原来需要写serlvet,现在改写action。
4、在action中把HttpServletRequest参数和HttpServletResponse参数传递过去。
5、在过滤器中通过java的反射机制调⽤action。
6、详细过程参照cn.itcast.action包中的内容3Struts2介绍1、struts2是apache组织发明的开源框架。
1. Struts2简介1.1. 什么是Struts21.1.1. Struts2的概念Struts2是轻量级的MVC框架,它主要解决了请求分发的问题,重心在于控制层和表现层。
轻量级,指的是Struts2具有较低的侵入性,就是它对我们业务代码的依赖程度很低,简单来说,在使用Struts2框架时,我们的业务代码中基本上不需要import它的包。
Struts2实现了MVC,满足了MVC设计思想。
在我们使用Struts2做开发的时候,就相当于使用了MVC,这是Struts2自动帮助我们实现的,是默认的、隐含的,我们不需要再写特别的代码来实现MVC了。
作为一个框架,Struts2提供了一系列的API,我们可以使用它们来简化代码的编写,从而提升开发效率。
这些API复用程度很高,对业务代码的依赖性也很小,甚至很多是Struts2自动调用的,因此在很大程度上,我们的开发变得可以复用。
Struts2解决请求分发的问题,我们会在后面为什么使用Struts2中讲解。
重心在控制层和表现层,是纵观整个Struts2理论课程来看的,从中我们会体会到这一点,随着大家对Struts2的逐步了解,届时我们再回顾这一点。
1.1.2. 什么是MVCMVC是代码的分层思想,是软件设计领域经典的设计模式。
它根据代码功能的不同,将一个软件的代码分为3部分,即模型、视图、控制器,这3部分代码的含义和功能如下。
1、M-Model 模型模型(Model)的职责是负责业务逻辑。
包含两层:业务数据和业务处理逻辑。
比如实体类、DAO、Service都属于模型层。
2、V-View 视图视图(View)的职责是负责显示界面和用户交互(收集用户信息)。
属于视图的组件是不包含业务逻辑和控制逻辑的JSP。
3、C-Controller 控制器控制器是模型层M和视图层V之间的桥梁,用于控制流程。
比如:在Servlet项目中的单一控制器ActionServlet。
若以框架的缺点
Struts2框架(MVC框架)的优点如下:
1)实现了MVC模式,层次结构清晰,使程序员只需关注业务逻辑的实现;
2)丰富的标签库,大大提高了开发的效率;
3) Struts2提供丰富的拦截器实现
3)通过配置文件,就可以掌握整个系统各个部分之间的关系;
4)异常处理机制,只需在配置文件中配置异常的映射,即可对异常做相应的处理;
Spring框架的优点如下:
1)无入侵性(在业务逻辑代码中感觉不到Spring框架的存在);
2)各个组件之间的耦合极为松散;
3)无需程序员自己实现singleton模式;
4)通过AOP,可以实现事务管理和日志管理;
5)整合其他的框架,如:struts框架和hibernate框架;
Hibernate框架(ORM框架)的优点如下:
1)对象/关系数据库映射(ORM),使用时只需操纵对象,使开发更加面向对象化;
2)无入侵性;
3)简洁的HQL语句,减少了JDBC与SQL操作数据库的代码量;
4)移植性好;
缺点如下:
1)对批量更新,删除的支持不好;
mybatis框架的优点如下:
1. 易于上手和掌握。
2. sql写在xml里,便于统一管理和优化。
3. 解除sql与程序代码的耦合。
4. 提供映射标签,支持对象与数据库的orm字段关系映射
5. 提供对象关系映射标签,支持对象关系组建维护
6. 提供xml标签,支持编写动态sql。
Java Web框架的选择与应用实战随着互联网技术的飞速发展,Web应用成为了当今互联网世界中的重要组成部分。
而在Web开发中,框架的作用越来越被人们所重视。
Java作为一门广泛应用于Web开发领域的编程语言,也涌现出了一批优秀的Web框架,如Spring MVC、Struts2等。
本文将就Java Web框架的选择与应用实战进行探讨。
一、Web框架的选择在选择Java Web框架时,除了要考虑自身的开发能力、需求以及项目特点外,还需要考虑框架的性能、安全性、稳定性等方面。
下面对几种常见的Java Web框架进行简单的介绍和评价,以供参考。
1. Spring MVCSpring MVC是一个模块化的Web应用框架,是基于Spring Framework的一个子框架,它支持多种视图技术,可用于开发RESTful Web应用和基于服务的Web应用。
该框架易于使用、扩展性强、提供了很好的测试支持,但也存在着过于复杂、学习曲线较陡峭等缺点。
2. Struts2Struts2是一个基于MVC模式的Web应用框架,它是Struts框架的后续版本。
该框架提供了大量的标签库支持,可以方便地实现各种表单操作。
它易于使用、对XML文件配置的支持逐渐减少,但也存在着减速代码的臃肿、性能不如其他框架等缺点。
3. Play FrameworkPlay Framework是一个开源的高度可扩展的Web应用框架,它采用了异步编程的方式,支持Java和Scala两种编程语言。
Play Framework使用了一种独特的路由机制,可以极其方便地实现URL路由。
它快速上手,性能优异,但也存在着不太适合大型项目、文档不太全面的缺点。
二、应用实战在选择了适合自己的Java Web框架后,我们需要在具体项目中进行实际应用。
下面以Spring MVC框架为例,介绍其在开发一个Web应用中的具体应用实战。
1. 搭建Maven工程Maven是一个强大的项目管理工具,我们可以使用它来构建一个Spring MVC的工程。
Struts2集成指南关于Struts2Struts是Apache软件基金会(ASF)赞助的一个开源项目。
它最初是Jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。
它通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-View-Controller〔MVC〕设计模式的应用框架〔Web Framework〕,是MVC经典设计模式中的一个经典产品。
Struts,a history在Java EE的Web应用发展的初期,除了使用Servlet技术以外,普遍是在JavaServer Pages(JSP)的源代码中,采用HTML与Java代码混合的方式进行开发。
因为这两种方式不可避免的要把表现与业务逻辑代码混合在一起,都给前期开发与后期维护带来巨大的复杂度。
为了摆脱上述的约束与局限,把业务逻辑代码从表现层中清晰的分离出来,2000年,Craig McClanahan采用了MVC的设计模式开发Struts。
后来该框架产品一度被认为是最广泛、最流行JAVA的WEB应用框架。
Craig McClanahan2006年,WebWork与Struts这两个优秀的Java EE Web框架(Web Framework〕的团体,决定合作共同开发一个新的,整合了WebWork与Struts优点,并且更加优雅、扩展性更强的框架,命名为“Struts 2”,原Struts的1.x版本产品称为“Struts 1”。
至此,Struts项目并行提供与维护两个主要版本的框架产品——Struts 1与Struts 2。
Struts1 vs. Struts2侵入性Struts 1在编程方面是面向抽象类编程,而不是面向接口编程。
Struts 1要求自定义Action 类继承一个特定的抽象基类Action。
另一方面,Struts 1的 Action 依赖于 Servlet API,因为Struts 1 Action 的execute 方法中有HttpServletRequest 和HttpServletResponse 方法。
struts2漏洞原理
Struts2是一种基于Java的开源Web应用框架,它可以帮助开发者快速开发和部署复杂的Web应用程序。
然而,由于Struts2存在一些严重的安全缺陷,攻击者可以利用这些漏洞实施各种攻击,包括远程执行代码、SQL注入和命令注入等。
其中,Struts2远程执行代码漏洞是最为臭名昭著的漏洞之一,该漏洞存在于struts2框架的核心代码里,并且可以通过网络访问执行任意代码,从而导致服务器被完全控制。
攻击者通常通过构造恶意的请求来利用这个漏洞,例如在HTTP请求的头部或参数中插入特殊的代码片段,从而触发struts2的漏洞。
攻击者可以利用这个漏洞执行任意代码,包括删除文件、修改数据、窃取数据等操作。
其原因是,Struts2应用程序在接收到HTTP请求时,会将请求参数转换成Java 对象,并使用一种名为OGNL(Object-Graph Navigation Language)的表达式语言来解析这些对象。
攻击者可以在HTTP请求中注入恶意的OGNL表达式,使其在服务器上执行任意代码。
此外,Struts2还存在一些其他的安全漏洞,包括文件读取漏洞、XSS漏洞和跨站请求伪造(CSRF)漏洞等。
这些漏洞可以通过错误的配置、不安全的代码实现和其他不当的安全实践而导致。
因此,为保障应用程序的安全稳定运行,使用
Struts2开发Web应用程序的开发者需要注意代码的安全性和其他防御性措施的实现。
Spring MVCSpringMVC非常优秀的MVC框架, 由其是在3.0版本发布后, 现在有越来越多的团队选择了Spring3 MVC来作为MVC的框架.SpringMVC结构简单,灵活性较高,性能也很优秀。
核心类与接口:DispatcherServlet -- 前置控制器HandlerMapping接口-- 处理请求的映射HandlerMapping接口的实现类:SimpleUrlHandlerMapping 通过配置文件,把一个URL映射到Controller DefaultAnnotationHandlerMapping 通过注解,把一个URL映射到Controller类上HandlerAdapter接口-- 处理请求的映射AnnotationMethodHandlerAdapter类,通过注解,把一个URL映射到Controller类的方法上Controller接口-- 控制器由于我们使用了@Controller注解,添加了@Controller注解注解的类就可以担任控制器(Action)的职责,所以我们并没有用到这个接口。
HandlerInterceptor 接口--拦截器我们自己实现这个接口,来完成拦截的器的工作。
ViewResolver接口的实现类UrlBasedViewResolver类通过配置文件,把一个视图名交给到一个View来处理InternalResourceViewResolver类,比上面的类,加入了JSTL的支持View接口JstlView类LocalResolver接口HandlerExceptionResolver接口--异常处理SimpleMappingExceptionResolver实现类ModelAndView类核心流程图DispatcherServlet说明使用Spring MVC,配置DispatcherServlet是第一步。
DispatcherServlet是一个Servlet,所以可以配置多个DispatcherServlet。
struts2.0.14在myeclipse下的环境搭建和第一个例子注:本文是在看过黎活明老师的视频前2章后写下的。
Struts2是在webwork2基础上发展而来的,struts2属于MVC框架。
Struts2相对于struts1的优点:1,struts2提供了拦截器,利用拦截器可以进行AOP(Aspect Oriented Programming)编程,实现如权限拦截等功能。
2,struts2提供了类型转换器,我们可以把特殊的请求参数转换成需要的类型。
在strut1中,如果要实现同样的功能,就必须向struts1的底层实现BeanUtil注册类型转换器才行。
3,提供了支持多种表现层技术,如jsp,freemarker4,输入校验可以对指定方法进行校验5,提供了全局范围,包范围和Action范围的国际化资源文件管理实现搭建开发环境:1,找到所需的jar文件Jar文件在官网可以下载:/根据所需下载相应的版本,下载struts-x.x.x-all.zip即可,解压后,在lib下可以找到以下的jar文件。
struts2-core-2.x.x.jar:struts2框架的核心类库xwork-2.x.x.jar:xwork类库,struts2在其上构建ognl-2.6.x.jar:对象图导航语言,struts2框架通过其读写对象的属性freemarker-2.3.x.jar:struts2的ui标签的模板使用freemarker编写commons-logging-1.1.x.jar:ASF出品的日志包,struts2框架使用这个日志包来支持log4和jdk1.4+的日志记录commons-fileupload-1.2.1.jar:文件上传组件,2.1.6版本后必须加入此文件2,编写配置文件在src下新建xml文件:struts.xmlXml文件内容如下:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"></struts>3,在web.xml中加入struts2mvc框架启动配置修改/WebRoot/WEB-INF/web.xml文件:<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>/*</url-pattern></filter-mapping>在struts1中,struts框架是通过servlet启动的,而在struts2中,struts 框架是通过filter启动注意事项:在struts2读取到struts.xml的内容后,以javabean的形式存放在内存中,以后struts对用户的每次请求处理将使用内存中的数据,而不是每次都读取struts.xmlwar文件解压:jar xvf *.war(在官网下载的压缩包里面有4个war文件,解压后是4个例子)通过以上操作,一个struts2的环境就搭建好了。
本文介绍了java开发流行框架struts2以及webwork的一些安全缺陷,并举例说明框架本身以及开发人员使用框架时,所产生的种种安全问题,以及作者挖掘框架安全漏洞的一些心得体会。
推荐以下人群阅读了解java开发了解框架开发了解web application安全“网络安全爱好者”正文当前java开发网站,通常不会是纯JSP的,大都使用了java framework。
有了这些framework,让开发人员更加快速的开发出代码,也让代码非常具有可扩展性,那些分层架构的思想,更是深入人心。
这些也大大影响了安全代码审核,曾提出“分层审核代码”的思想,比如在DAO层专门检查sql注入,在view层检查xss等。
这些框架都有自己的层级,本次文章主要讲的是struts这个框架的相关安全问题,也会有小部分涉及到struts后面的DAO层。
而struts这个框架更新占有市场份额极大的一个框架,它在各个层级中,位于如图所示位置:可以看到struts在web应用中,负责处理接收用户数据,调用业务处理,以及展示数据的工作。
所以本文把struts的功能分为controller层和view层,controller层来完成接收用户数据,分发用户请求,而view专门用于展示数据。
一个单独的struts,是不合逻辑的,因为架构师通常喜欢多种框架集合,让它们各自负责某一层的处理。
研究一个框架的安全问题,不能仅仅站在框架的角度,还应该充分考虑到开发人员是如何使用这些框架的,他们最喜欢写什么样的代码,这样才能还原一个正常的、完整的web应用场景。
从搜索结果看,互联网中,绝大多数教程推荐struts+hibernate+spring这样的黄金组合,那么,我假设有一个应用使用了这个组合,以struts为重点,站在攻击者的角度,层层分析struts的设计缺陷。
Struts2开发回顾与简单学习为了让大家回顾或者学习一下struts2,我们一起来建立一个action、jsp页面,做一个接收用户输入,之后处理一下,再展示出来给用户的过程,精通struts2的同学可以跳过此步。
-------------------------------------struts回顾start首先建立action,叫做AaaaAction:public class AaaaAction extends ActionSupport{private String name;public String getName() {return name;}public void setName(String name) { = name;}public String execute(){System.out.println("exe");return SUCCESS;}public String bbb(){System.out.println("bbbbb");return SUCCESS;}}请注意execute这个方法,让用户输入action的地址后,默认会访问这个方法。
之后配置struts.xml文件<action name="aaaaaaa" class="net.inbreak.AaaaAction"><result name="success">user/aaa.jsp</result></action>配置这个文件后,当用户输入/app/aaaaaaa.action的时候,struts会负责让AaaaAction中的execute方法处理用户请求。
处理之后,该方法返回“return SUCCESS;”,struts又负责找到result的name 是seccuess所指向的jsp页面。
把该页面解析后,返回给用户。
而用户看到的就是aaa.jsp页面的html代码。
struts2继承了webwork的所有优点,其实等于是webwork的升级,如果开发人员想让用户直接访问action中的某方法,而不是访问默认的execute方法,只要定义一个方法叫做bbb,并且是public的,用户就可以直接输入/app/aaaaaaa!bbb.action直接访问了bbb方法。
那request中的参数如果接收呢?struts2中,这个过程被包装了起来,使用非常方便,只要在action中定义一个属性,叫做public String name;。
然后加入getName和setName方法,就可以像正常使用属性一样,接收到用户传递过来的变量。
无论是get请求还是post请求,都可以使用这种方式接收用户输入。
整个过程就如此简单,现在大家对流程有了了解,我们就开始讨论正文,如果还是想了解更多,请自行google。
----------------------------------struts回顾endStruts2安全缺陷可以看到struts2在数据流向方面,有两个重点,一个是进入(in),一个是输出(out)。
而我在做漏洞挖掘的思路,也是跟着这个数据的流程,开始分析的,下面我们就开始让数据进入。
Action属性默认值可以被覆盖缺陷:在日常的java项目中,我们经常会遇到保存一个新的对象(比如注册一个用户),然后给这个对象赋予一些用户提交上来的属性值,在这里,只需要定义一个对象类:public class User {private Long id=0l;private String name;private String pass;private Integer type=1;。
下面的get和set方法代码略}定义后,在action中,添加一个属性User reguser;用户注册的页面代码如下:<form XXXXXXX><input name="">当用户提交这个form到action中后,struts2会负责自动映射的值到reguser的相关属性(name)中,所以在execute这个方法中,就可以使用reguser.getName()拿到用户提交的的值。
所以我们下面的代码就很简单了:public String execute(){add(user);add方法,更简单了,因为我们项目中集成了hibernate,这个框架自动映射user 类中的各个属性,自动组成insert语句。
我们只要在add中调用session.save(user);就可以保存用户到数据库中。
前文提到那么多“简单”两个字,难道这些过程都是安全的而他给我们仅仅带来了方便么?struts2只负责映射所有对象,他提供了form验证,也只能验证form中属性值的内容,比如email格式等,并不能约束用户提交其他属性上来,于是这就变成了十分危险的功能。
当User中有个属性type,代表User是否管理员时(1为普通用户,2为管理员),麻烦来了,攻击者在原来的注册表单中,新加入一个input,叫做<input name="reguser.type">然后输入值是2,把这个值一起交给action。
在这个流程中,这个值,当然也会被自动带到数据库中,向下处理的逻辑中,这个用户,就已经变成管理员了。
当你看到了一个struts2或者webwork的应用,可以尝试使用属性攻击,修改当前表单,里面有所有你猜测到的属性,一并提交上来,就可能会影响整个逻辑,达到攻击目的。
文中仅仅是一个例子,事实上,在数据传递的过程中,可以任意覆盖数据的默认值,本来就是一个危险的缺陷,而struts2和webwork这两个框架仅仅看到了它带来的好处,忽略了这方面基于安全性的考虑,仅仅关注了用户提交数据的正确性。
对比在没有struts2这个功能的时候,我们却需要在action中一个一个的把需要的变量,从用户提交的request中解出来,一个一个处理,不可能出现这种安全问题。
现在它包装了这个过程,自以为很方面,却出了严重问题。
Action中的方法被暴力猜解缺陷前文提到,有一种方法可以让用户访问action时,不访问默认的execute方法,而是直接访问其他action中的方法,条件是在action中,写一个public的方法。
开发人员如果需要做一个登陆后,展示所有用户列表的功能,而他的一个“解耦合”的开发习惯,将在这里导致安全缺陷。
定义一个如下的actionpublic class Userlogin extends ActionSupport{private String uname="";private String upwd;private List list;//getter and setter 方法略public String login(){if(uname!=null&&upwd!=null&&uname.equals("kxlzx")&&upwd.equals("pass" )){//if login successreturn list();}return false;}public String list(){list.add("kxlzx");list.add("kxlzx1");list.add("kxlzx2");list.add("kxl zx3");return "list";}}Userlogin中,因为list这个功能(显示所有用户列表),其实是一个通用的功能,很容易被其他地方调用,所以开发人员把它单独写成了一个方法。
当用户登陆的时候,打开/app/userlogin!login.action来到了用户的登陆页面,可以看到,只有用户输入正确的用户名和密码,才能最终调用list()方法,显示结果。
但是struts2把所有public的方法都暴露了出去,导致现在用户输入了/app/userlogin!list.action用户访问这个链接后,struts2调用list方法,然后返回结果给用户,所以没有登陆,就显示了所有用户信息,直接绕过了login中的登陆验证。
在没有struts2的时候,我们要在servlet的doget或者dopost方法中,写if 判断等代码,才能让用户调用其他servlet中的方法,现在看来其实这也是一种保护措施。
而现在struts2为了方便开发,把所有的public方法统一映射了出去,导致开发把一个经常使用的功能,习惯写成一个public的方法,现在居然成了严重漏洞。