struts2工作原理

合集下载

Struts2框架工作原理及应用体会

Struts2框架工作原理及应用体会
图1
二、Struts2 工作原理 ( 一) Struts2 框架组成。Struts2 框架由三个主要部分组 成: 核心控制器、业务控制器,以及由用户实现的业务逻辑组 件。这里我们将侧重于核心控制器与业务控制器的理解与 说明。
( 二 ) 核 心 控 制 器: FilterDispatcher。 FilterDispatcher 是 Struts2 框架的核心控制器 ,在此,我们可以将 FilterDispatcher 看作一个类似于过滤网的过滤器。当用户发出请求,并到达 Web 硬哟那种时,该过滤器会过滤用户请求。如果用户请求 的结尾为 action,则将该请求转入 Struts2 框架进行处理。当 Struts2 框架获得了* . actio 请求后,会根据请求前面“* ”的 那部分内容,决定调用哪个业务逻辑组件作为响应单位。这 里需要说明的是 Struts2 用来处理用户请求的 Action 实例并 不是业务控制器,而是作为 Action 的代理———正因为 Struts2 的一大特点,与 Servlet API 的非耦合性,使得用户实现的业 务控制器无法直接处理用户请求。有效的提高了后期调试 维护的效率。而 Struts2 框架再次提供了了一系列的拦截器。 这些拦截器负责将 HttpServletRequest 请求的参数解析出来, 传入 Action 中,并毁掉 Action 的 Execute 方法来处理用户请 求。用户实现的 Action 类仅作为 Struts2 的 Action 代理的代 理目标。用户实现的业务控制器则包含了对用户请求的处 理。用户的请求数据包含在 HttpServletRequest 对象中,而用 户的 Action 类无需访问 HttpServletRequest 对象。拦截器负 责将 HttpServletRequest 里的请求数据解析出来,并传给业务 逻辑组件 Action 实例。

struts2

struts2

—高级软件人才实作培训专家! 高级软件人才实作培训专家!
搭建Struts2开发环境
搭建Struts2环境时,我们一般需要做以下几个步骤的工作: 1》找到开发Struts2应用需要使用到的jar文件. 2》编写Struts2的配置文件 3》在web.xml中加入Struts2 MVC框架启动配置
北京传智播客教育
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
搭建Struts2开发环境--Struts2在web中的启动配置
在struts1.x中, struts框架是通过Servlet启动的.在struts2中, struts框架是通过Filter启动的.他在web.xml中的配置如下:
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
Struts2
讲师: 讲师:黎活明
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
Struts2
Struts2是在WebWork2基础发展而来的.和struts1一样, Struts2也属于MVC框架. 不过有一点大家需要注意的是:尽管Struts2和struts1在名字上的差别不是很大,但 Struts2和struts1在代码编写风格上几乎是不一样的.那么既然有了struts1,为何还要 推出struts2.主要是因为struts2有以下优点:
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
第一个Struts2应用--HelloWorld
在默认的配置文件struts.xml 中加入如下配置:
<?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> <package name="itcast" namespace="/test" extends="struts-default"> <action name="helloworld" class="cn.itcast.action.HelloWorldAction" method="execute" > <result name="success">/WEB-INF/page/hello.jsp</result> </action> </package> </struts>

struts2自学完全文档

struts2自学完全文档

一.Struts2基础知识1. struts2的特点及配置1.1struts2与struts1的比较1)在软件设计上struts2没有struts1那样跟ServletApi和StrutsApi有着紧密的耦合,Struts2的应用可以不因爱ServletApi和StrutsApi.struts2的这种设计属于无侵入式设计,而Struts1却属于侵入式设计public class OrderListAction ectends Action//struts依赖于java2)Struts2提供了拦截器,利用拦截器可以进行AOP编程,实现如权限拦截等功能3)Struts2提供了类型转换器,我们可以把特殊的请求参数转换成我们需要的类型,在struts1中,如果我们实现同样的功能,就必须向struts1的底层实现BeanUtil注册类型转换器4)Struts2提供了支持多种表现层技术,如JSp,freeMarker等5)Struts2的输入校验可以对指定方法进行校验,解决了Struts的长久之疼6)提供了全局范围,包范围和Action范围的国际化资源文件管理实现1.2搭建struts2的开发环境1)新建web项目2)导入必要的包3)写配置文件Struts2默认的配置文件为Struts.xml,该文件需要存放在WEB-INF/classes下,该文件的配置模板如下(在m yeclipse中放在src目录下就可以了)模板在D:\Program Files\struts-2.3.4.1-all\struts-2.3.4.1\apps 解压struts2-blank.var再打开web-info/classes中的struts.x m l文件即可<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration2.3//EN""/dtds/struts-2.3.dtd"><struts></struts>4)在web.xm l中加入Struts2MVC框架启动配置在struts1.x中struts框架是通过Servlet启动的,在struts2中,struts框架式通过Filter 启动的,他在web.xm l中的配置如下:(D:\Program Files\struts-2.3.4.1-all\struts-2.3.4.1\apps 解压struts2-blank.var再打开Web-Info\web.xm l即可)<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.Str utsPrepareAndExecuteFilter</filter-class><!—自从struts2.1.3以后,下面的FilterDispatcher已经标注为过时<filter-class>org.apache.struts2.dispatcher.ng.filter.FilterDispather</filter-class> --></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>在StrutsPrepareAndEXecuteFilter()方法中将会读取类路径下的默认文件struts.xml完成初始化操作。

Struts2漏洞利用原理及OGNL机制

Struts2漏洞利用原理及OGNL机制

Struts2漏洞利⽤原理及OGNL机制Struts2漏洞利⽤原理及OGNL机制研究概述在MVC开发框架中,数据会在MVC各个模块中进⾏流转。

⽽这种流转,也就会⾯临⼀些困境,就是由于数据在不同MVC层次中表现出不同的形式和状态⽽造成的:View层—表现为字符串展⽰数据在页⾯上是⼀个扁平的、不带数据类型的字符串,⽆论数据结构有多复杂,数据类型有多丰富,到了展⽰的时候,全都⼀视同仁的成为字符串在页⾯上展现出来。

数据在传递时,任何数据都都被当作字符串或字符串数组来进⾏。

Controller层—表现为java对象在控制层,数据模型遵循java的语法和数据结构,所有的数据载体在Java世界中可以表现为丰富的数据结构和数据类型,你可以⾃⾏定义你喜欢的类,在类与类之间进⾏继承、嵌套。

我们通常会把这种模型称之为复杂的对象树。

数据在传递时,将以对象的形式进⾏。

可以看到,数据在不同的MVC层次上,扮演的⾓⾊和表现形式不同,这是由于HTTP协议与java的⾯向对象性之间的不匹配造成的。

如果数据在页⾯和Java世界中互相传递,就会显得不匹配。

所以也就引出了⼏个需要解决的问题:1.当数据从View层传递到Controller层时,我们应该保证⼀个扁平⽽分散在各处的数据集合能以⼀定的规则设置到Java世界中的对象树中去。

同时,能够灵活的进⾏由字符串类型到Java中各个类型的转化。

2.当数据从Controller层传递到View层时,我们应该保证在View层能够以某些简易的规则对对象树进⾏访问。

同时,在⼀定程度上控制对象树中的数据的显⽰格式。

我们稍微深⼊思考这个问题就会发现,解决数据由于表现形式的不同⽽发⽣流转不匹配的问题对我们来说其实并不陌⽣。

同样的问题会发⽣在Java世界与数据库世界中,⾯对这种对象与关系模型的不匹配,我们采⽤的解决⽅法是使⽤如hibernate,iBatis等框架来处理java对象与关系数据库的匹配。

现在在Web层同样也发⽣了不匹配,所以我们也需要使⽤⼀些⼯具来帮助我们解决问题。

struts2核心工作流程与原理

struts2核心工作流程与原理

struts2核心工作流程与原理做为一名技术人员,听到太多关于.net和java的比较的话题。

我想对那些技术人员说,请先了解一下什么是java(或者.net)吧,其实你根本不了解。

这是Struts2官方站点提供的Struts 2 的整体结构。

一个请求在Struts2框架中的处理大概分为以下几个步骤1.客户端提起一个(HttpServletRequest)请求,如上文在浏览器中输入”http://localhost:8080/TestMvc/add.action”就是提起一个(HttpServletRequest)请求。

2.请求被提交到一系列(主要是三层)的过滤器(Filter),如(ActionContextCleanUp、其他过滤器(SiteMesh等)、 FilterDispatcher)。

注意这里是有顺序的,先ActionContextCleanUp,再其他过滤器(SiteMesh等)、最后到 FilterDispatcher。

3.FilterDispatcher是控制器的核心,就是mvc中c控制层的核心。

下面粗略的分析下我理解的FilterDispatcher工作流程和原理:FilterDispatcher进行初始化并启用核心doFilter其代码如下:public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain ) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) res;ServletContext servletContext = filterConfig.getServletContext();// 在这里处理了HttpServletRequest和HttpServletResponse。

struts2面试题

struts2面试题

struts2面试题Struts2是一个基于Java开发的Web应用程序框架,被广泛应用于企业级Java应用开发中。

在面试中,面试官可能会提出一些关于Struts2的问题,以评估应聘者的技术水平。

下面是一些常见的Struts2面试题及其详细答案,希望对你在面试中有所帮助。

1. 什么是Struts2?Struts2是一个轻量级的、基于MVC模式的Web应用程序框架。

它采用Java Servlet API和JavaServer Pages (JSP)技术,并提供了一种简单易用的方式来开发可维护和可扩展的Web应用程序。

2. Struts2的主要特性是什么?Struts2的主要特性包括:- MVC架构:将应用程序分为模型、视图和控制器,使开发更容易管理和扩展。

- 拦截器:通过拦截器可以在请求处理的各个阶段添加自定义的逻辑。

- 标签库:提供了丰富的标签库,简化了页面开发。

- 表单验证:提供了灵活且强大的表单验证机制,可以验证用户输入的数据。

- 国际化支持:支持多语言和本地化。

- 配置简单:通过配置文件来管理应用程序的行为。

3. Struts2的工作原理是什么?Struts2的工作原理如下:1) 客户端发送HTTP请求到服务器。

2) 服务器将请求交给Struts2的过滤器(Filter)。

3) 过滤器通过配置文件找到对应的Action,并调用相应的方法。

4) Action处理请求,并返回一个结果页面的名称或一个结果对象。

5) 结果页面的名称通过配置文件进行映射,服务器将其发送给客户端。

4. 什么是Struts2中的Action类?Action类是Struts2框架中的核心组件,用于处理Web请求。

一个Action类对应一个业务功能,其包含了要执行的方法和数据。

它负责接收请求、处理业务逻辑、将结果返回给前端页面。

5. Struts2中的拦截器是什么?有哪些内置的拦截器?拦截器是Struts2中的组件,用于在请求处理的各个阶段添加自定义的逻辑。

struts2-2(拦截器)

struts2-2(拦截器)

17
18
• validation拦截器
– 调用验证框架进行数据验证
• workflow拦截器
– 调用Action类的validate(),执行编码验证
11
Struts 2默认拦截器栈
• struts-default.xml中定义一个defaultStack拦截器栈,并将其指 定为默认拦截器 • 只要在定义包的过程中继承struts-default包,那么defaultStac k将是默认的拦截器
• 8、Action执行完毕,ActionInvocation负责根据结果码字符 串在struts.xml的配置中找到对应的返回结果 • 9、拦截器被再次执行
• 10、过滤器被再次执行
4
Struts 2核心接口和类
• ActionMapper
– 根据请求的URI查找是否存在对应Action调用
• ActionMapping
10
Struts 2自带拦截器
• Params拦截器
– 负责将请求参数设置为Action属性
• servletConfig拦截器
– 将源于Servlet API的各种对象注入到Action
• fileUpload拦截器
– 对文件上传提供支持
• exception拦截器
– 捕获异常,并且将异常映射到用户自定义的错误页面
12
配置拦截器
<package name="packName" extends="struts-default" namespace="/manage"> <interceptors> <!-- 定义拦截器 --> <interceptor name="interceptorName" class="interceptorClass" /> <!-- 定义拦截器栈 --> <interceptor-stack name="interceptorStackName"> <!--指定引用的拦截器--> <interceptor-ref name="interceptorName|interceptorStackName" /> </interceptor-stack> </interceptors> <!--定义默认的拦截器引用--> <default-interceptor-ref name="interceptorName|interceptorStackName" /> <action name="actionName" class="actionClass"> <!—为Action指定拦截器引用--> <interceptor-ref name="interceptorName|interceptorStackName" /> <!--省略其他配置--> </action> </package>

s2-052原理

s2-052原理

s2-052原理S2-052是指一种计算机安全漏洞,原理是利用Apache Struts 2框架的一个漏洞来执行远程代码。

Apache Struts 2是一个用于构建Web应用程序的开源框架,被广泛使用。

S2-052漏洞是Struts 2框架的一个安全漏洞,其原理是对Struts 2的核心组件——OGNL(Object-Graph Navigation Language)表达式进行了恶意注入。

在受到该漏洞攻击的情况下,攻击者可以构造恶意请求并发送给受影响的服务器。

服务器接收到请求后,会解析请求中的OGNL表达式,并在执行过程中未对其进行充分验证和过滤,导致攻击者可以在服务器上执行任意代码。

通过利用S2-052漏洞,攻击者可以实现远程命令执行,包括任意文件读取、文件删除、命令执行等操作。

这可能导致服务器的敏感数据泄露、系统被入侵、服务被停止等安全问题。

为了修复这个漏洞,Apache Struts 2开发团队发布了针对S2-052漏洞的安全补丁。

用户应该尽快更新Struts 2框架,并确保及时应用最新的安全补丁,以防止受到S2-052漏洞的攻击。

S2-052漏洞的具体原理如下:1. Apache Struts 2框架中的DefaultActionMapper类存在安全问题,攻击者可以通过构造恶意的请求来利用该漏洞。

2. 默认情况下,Struts 2框架使用的是通配符“/*”来匹配URL中的动作(action)。

攻击者可以通过构造特殊的URL,例如“/*/xxx.action”,来绕过框架的安全检查。

3. 在解析请求时,DefaultActionMapper会将URL中的动作部分进行解析。

恶意请求中的动作部分包含OGNL表达式,由${}包裹。

4. OGNL是Struts 2框架中用于动态访问和操作Java对象的表达式语言,可以通过OGNL表达式执行代码。

5. 由于默认配置下Struts 2框架对OGNL表达式的处理不够安全,未对其中的特殊字符进行充分的过滤和验证。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Struts2 的工作机制 3.1Struts2 体系结构图 Strut2 的体系结构如图 15 所示:
(图 15) 3.2Struts2 的工作机制 从图 15 可以看出,一个请求在 Struts2 框架中的处理大概分为以下几个步骤: 1、客户端初始化一个指向 Servlet 容器(例如 Tomcat)的请求;
4、如果 ActionMapper 决定需要调用某个 Action,FilterDispatcher 把请求的处理交给 ActionProxy;
5、ActionProxy 通过配置文件,找到需要调用的 Action 类;
6、ActionProxy 创建一个 ActionInvocation 的实例。
下表是对一些重要类的说明: 类名 org.apache.struts2.dispatcher. Dispatcher org.apache.struts2.dispatcher. FilterDispatcher
说明 该类有两个作用:
1、初始化
2、调用指定的 Action 的 execute()方法。 这是一个过滤器。文档中已明确说明,如果没有经验,
另外,Struts2 可视化视图组件开始支持主题(theme),缺省情况下,使用自 带的缺省主题,如果要自定义页面效果,需要将组件的 theme 属性设置为 simple。
org.apache.struts2. config
该包定义与配置相关的接口和类。实际上,工程中的 xml 和 properties 文件的读 取和解析都是由 WebWork 完成的,Struts 只做了少量的工作。
org.apache.struts2.dispatcher Struts2 的核心包,最重要的类都放在该包中。
org.apache.struts2.impl
该包只定义了 3 个类,他们是 StrutsActionProxy、StrutsActionProxyFactory、 StrutsObjectFactory,这三个类都是对 xwork 的扩展。
"com.opensymphony.xwork2.dispatcher.ServletDispatcher"; /** *Constantfortheservlet context}object. */ publicstaticfinal String SERVLET_CONTEXT = "com.opensymphony.xwork2.dispatcher.ServletContext"; /** *ConstantfortheJSPpage context}. */ publicstaticfinal String PAGE_CONTEXT = "com.opensymphony.xwork2.dispatcher.PageContext"; /**ConstantforthePortletContextobject*/ publicstaticfinal String STRUTS_PORTLET_CONTEXT = "struts.portlet.context"; }
2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做 ActionContextCleanUp 的可选过 滤器,这个过滤器对于 Struts2 和其他框架的集成很有帮助,例如:SiteMesh Plugin);
3、接着 FilterDispatcher 被调用,FilterDispatcher 询问 ActionMapper 来决定这个请求是否需要调用某 个 Action;
"; /** *ConstantfortheHTTPresponseobject. */ publicstaticfinal String HTTP_RESPONSE = "com.opensymphony.xwork2.dispatcher.HttpServletRespo
nse"; /** *ConstantforanHTTPrequest dispatcher}. */ publicstaticfinal String SERVLET_DISPATCHER =
7、ActionInvocation 实例使用命名模式来调用,在调用 Action 的过程前后,涉及到相关拦截器(Interce pter)的调用。
8、一旦 Action 执行完毕,ActionInvocation 负责根据 struts.xml 中的配置找到对应的返回结果。返回结 果通常是(但不总是,也可能是另外的一个 Action 链)一个需要被表示的 JSP 或者 FreeMarker 的模版。在表 示的过程中可以使用 Struts2 框架中继承的标签。在这个过程中需要涉及到 ActionMapper。
容器启动后,FilterDispatcher 被实例化,调用 init(FilterConfig filterConfig)方法。该方法创建 Dispatcher 类 的对象,并且将 FilterDispatcher 配置的初始化参数传到对象中(详情请参考代码清单 10),并负责 Action 的执 行。然后得到参数 packages,值得注意的是,还有另外三个固定的包和该参数进行拼接,分别是 org.apache.st ruts2.static、template、和 org.apache.struts2.interceptor.debugging,中间用空格隔开,经过解析将包名变成路 径后存储到一个名叫 pathPrefixes 的数组中,这些目录中的文件会被自动搜寻。
packages = param + " " + packages; } this.pathPrefixes = parse(packages); }
代码清单 10:FilterDispatcher.createDispatcher()方法
protected Dispatcher createDispatcher(FilterConfig filterConfig) { Map<String,String> params = new HashMap<String,String>(); for (Enumeration e = filterConfig.getInitParameterNames(); e.hasMoreElements(); ) { String name = (String) e.nextElement(); String value = filterConfig.getInitParameter(name); params.put(name, value); } returnnew Dispatcher(filterConfig.getServletContext(), params);
publicinterface StrutsStatics { /** *ConstantfortheHTTPrequestobject. */ publicstaticfinal String HTTP_REQUEST = "com.opensymphony.xwork2.dispatcher.HttpServletRequest
org.apache.struts2.interceptor 定义内置的截拦器。
org.apache.struts2.util
实用包。
org.apache.struts2.validators 只定义了一个类:DWRValidator。
org.apache.struts2.views
提供 freemarker、jsp、velocity 等不同类型的页面呈现。
以下是对各包的简要说明:
包名
说明
org.apache.struts2. components
该包封装视图组件,Struts2 在视图组件上有了很大加强,不仅增加了组件的属 性个数,更新增了几个非常有用的组件,如 updownselect、doubleselect、 datetimepicker、token、tree 等。
实际上,FilterDispatcher 除了实现 Filter 接口以外,还实现了 StrutsStatics 接口,继承代码如下:
代码清单 7:FilterDispatcher 结构
publicclass FilterDispatcher implements StrutsStatics, Filter { }
dispatcher.init(); String param = filterConfig.getInitParameter("packages"); String packages = "org.apache.struts2.static template org.apache.struts2.interceptor.debugging"; if (param != null) {
代码清单 9:FilterDispatcher.init()方法
public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; dispatcher = createDispatcher(filterConfig);
3.3Struts2 源代码分析
和 Struts1.x 不同,Struts2 的启动是通过 FilterDispatcher 过滤器实现的。下面是该过滤器在 web.xml 文件 中的配置:
代码清单 6:web.xml(截取)
<filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class>
相关文档
最新文档