struts2核心工作流程与原理_第1页
struts2核心工作流程与原理_第2页
struts2核心工作流程与原理_第3页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、StrutsActionContextCleanUpOthor filters (SiteMosh. etc)FilterDispatcherAIHttpServletRequestActionProxy>Inter cep 仙 JActionMapperInterceptor 2lnteFGepor 3ConfigurationManagerTag SubsystemHTMLa Dojof toirns, etcAction AuTionInvocation 71Resultstruts.xmlInWG乎卩tor 3Irnercptor 2Interceptor 1 JTemplate

2、J SR FieeMarec Velocrty, etcHttpServletResponseKey:Servlet FiltersStruts CorelnterceptorsUseraeated这是Struts2官方站点提供的Struts 2 的整体结构。一个请求在Struts2框架中的处理大概分为以下几个步骤1. 客户端提起一个(HttpServletRequest )请求,如上文在浏览器中输入” localhost:8080/TestMvc/add.action”就是提起一个(HttpServletRequest )请求。2. 请求被提交到一系列(主要是三层)的过滤器(Filter )

3、,如( ActionContextCleanUp 、 其他过滤器(SiteMesh等)、FilterDispatcher )。注意这里是有顺序的,先ActionContextCleanUp ,再其他过滤器(SiteMesh 等)、最后到 FilterDispatcher 。3. FilterDispatcher是控制器的核心,就是mvc中c控制层的核心。下面粗略的分析下我理解的FilterDispatcher工作流程和原理:FilterDispatcher进行初始化并启用核心doFilter其代码如下:public void doFilter(ServletRequestreq,Servlet

4、Resp onseres,FilterCha inchai n)throws lOExcepti on,ServletExcepti onHttpServletRequest request = (HttpServletRequest) req;HttpServletResp onseresp onse= (HttpServletResp onse)res;ServletC on textservletC on text= filterC on fig.getServletC on text();/在这里处理了HttpServletRequest 和 HttpServletResp。nse。D

5、ispatcherUtils du = DispatcherUtils.get In sta nce();du.prepare(request,response); / 正如这个方法名字一样进行locale、encoding 以及特殊 request parameters 设置try request = du.wrapRequest(request,servletC on text);/ 对request 进行包装 catch(lOExcepti one) Stri ngmessage = "Could not wrap servlet request with MultipartR

6、equestWrapper!"LOG.error(message, e);throw new ServletExcepti on( message,e);Acti on MapperIFmapper = Acti on MapperFactory.getMapper(); / 得至U action 的 mapperActi onM app ingmapp ing= mapper.getMapp in g(request); /得至 Uacti on的 mapp ingif(mapping= null )/ there is no acti on in this request, sh

7、ould we look for a static resource?Stri ngresourcePath = RequestUtils.getServletPath(request);if ("".equals(resourcePath)&& null !=request.getPathIn fo()resourcePath = request.getPath lnfo();if("true".equals(Co nfiguratio n.get(WebWorkCo nsta nts.WEBWORK_SERVE_STATIC_CONT

8、ENT)&& resourcePath.startsWith("/webwork")Stri ngn ame = resourcePath.substr in g("/webwork".len gth();fin dStaticResource( name,resp on se);else / this is a no rmalrequest,let it pass throughcha in .doFilter(request,resp on se);/WW did its job herereturnObject o = null ;

9、try /setupCon tai ner(request);o = beforeActi onln vocati on( request,servletC on text);/整个框架最最核心的方法,下面分析du.serviceActi on( request,resp on se,servletC on text,mapping); fin allyafterActi onln vocati on( request,servletC on text,o);ActionContext.setContext(null );du.serviceActi on( request,resp on s

10、e,servletC on text,mapp in g);/这个方法询问 ActionMapper是否需要调用某个 Action来处理这个(request )请求,如果 ActionMapper 决定需要调用某个 Action , FilterDispatcher把请求的处理交给 ActionProxypublic void serviceActi on( HttpServletRequestrequest, HttpServletResp onse response, String namespace, String actionName, Map requestMap, Map para

11、meterMap , Map sessionMap, Map applicationMap)HashMap extraC on text= createC on textMap(requestMap,parameterMap,sessi on Map,applicati onM ap,request,resp on se,getServletC on fig();/ 实例化Map请求 ,询问ActionMapper是否需要调用某个 Action来处理这个(request )请求 extraContext.put(SERVLET_DISPATCHER,this );Ognl ValueStack

12、 stack = (Og nl ValueStack)request.getAttribute(ServletActio nCo ntext.WEBWORK_VALUESTACK_KEY);if (stack !=null ) extraCo ntext.put(Actio nCon text.VALUE_STACK, new Ognl ValueSt ack(stack);try Acti on Proxyproxy = Actio nProxyFactory.getFactory().createActi on Proxy (n amespace,acti onN ame,extraC o

13、n text);/这里actio nN ame是通过两道 getActio nN ame 解析岀来的,FilterDispatcher 把请求的处理 交给 ActionProxy ,下面是 ServletDispatcher 的 TODO:request.setAttribute(ServletActio nCo ntext.WEBWORK_VALUESTAC K_KEY, proxy.get In vocatio n().getStack();proxy.execute();/通过代理模式执行ActionProxyif (stack != null )request.setAttribute

14、(ServletActio nCo ntext.WEBWORK_V ALUESTACK_KEY,stack); catch(Con figurati on Excepti one) log.error("Couldnot findacti on",e);sen dError(request,resp on se,HttpServletRespo nse.SC_NOT_FOUND, e); catch (Excepti one)log.error("Couldnot execute acti on",e);sen dError(request,resp o

15、n se,HttpServletRespo nse.SC_INTERNAL_SERVER_ERROR,e);4. FilterDispatcher 询问ActionMapper是否需要调用某个 Action 来处理这个(request )请求,如果 ActionMapper 决定需要调用某个 Action , FilterDispatcher 把请 求的处理交给 ActionProxy。5. ActionProxy 通过 Configuration Manager ( struts.xml )询问框架的配置文件,找 到需要调用的 Action类.如上文的struts.xml 配置<?xm

16、lversio n="1.0"<! DOCTYPE strutsencoding="GBK" ?>PUBLIC "-/Apache SoftwareFoundation/DTDStruts Configuratio n <struts2.0/EN""/dtds/struts-2.0.dtd"<in cludefile ="struts-default.xml"/><package<acti onn ame="s

17、truts2"exte nds ="struts-default">n ame="add"class ="edis undon g.AddAct ion"<result >add.jsp </ result ></ action</ package></ struts如果提交请求的是add.action,那么找到的 Action 类就是edisundong.AddAction6. ActionProxy 创建一个 Actionlnvocation的实例,同时 Action

18、lnvocation 通过代理模式调用Action。但在调用之前Actionlnvocation会根据配置加载 Action相关的所有 Interceptor 。( Interceptor 是 struts2 另一个核心级的概念)下面我们来看看 Actio nln vocatio n是如何工作的:Actionlnvocation是Xworks 中Action调度的核心。而对Interceptor的调度,也正是由 Actionlnvocation负责。Acti onlnv ocati on是- -个接口,而 DefaultActionlnvocation则是 Webwork 对Actio nln

19、 vocation 的默认实现。In terceptor 的调度流程大致如下:1. Actionlnvocation初始化时,根据配置,加载Action相关的所有Interceptor 。2. 通过 Actionlnvocation.invoke方法调用 Action 实现时,执行 Interceptor。Interceptor将很多功能从我们的Action中独立岀来,大量减少了我们 Action的代码,独立岀来的行为具有很好的重用性。XWork、WebWork的许多功能都是有Interceptor实现,可以在配置文件中组装 Action用到的Interceptor,它会按照你指定的顺序,在

20、Action执行前后运行。那么什么是拦截器。拦截器就是 AOP( Aspect-OrientedProgramming )的一种实现。(AOP是指用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。)拦截器的例子这里就不展开了。struts-default.xml文件摘取的容:<rceptor" />< in terceptorn ame ="autowiri ng"class=".ope nsympho ny .xwork2.spri ng.i nterceptor.Actio nAutowir in gl nter

21、ceptor"/>< in terceptorn ame="cha in"class=".ope nsympho ny.xwork2.i nterceptor.Chai ningln terceptor"/>< in terceptorn ame="c on versio nError"class="org.apache.struts2.i nterceptor.StrutsC on versio nErrorl nterceptor"/>< in terceptorn

22、 ame="createSessi on"class ="org.apache.struts2.i nterceptor.CreateSessi onln terceptor"/>< in terceptorn ame="debuggi ng"class="org.apache.struts2.i nterceptor.debuggin g.Debugg ingln terceptor"/>< in terceptorn ame="exter nal-ref"class=

23、".ope nsymph ony .xwork2.i nterceptor.ExternalRefere ncesl nterceptor"/>< in terceptorn ame="execA ndWait"class ="org.apache.struts2.i nterceptor.ExecuteAn dWait In terceptor"/>< in terceptorn ame="excepti on"class=".ope nsymph ony .xwork2.i n

24、terceptor.Exception Mapp ingln terceptor"/>< in terceptorn ame="fileUpload"class ="org.apache.struts2.i nterceptor.FileUpload In terceptor"/>< in terceptorn ame="i18 n"class=".ope nsympho ny.xwork2.i nterceptor.118 nln terceptor"/>< in t

25、erceptorn ame="logger"class=".ope nsymph on y.xwork2.i nterceptor.Loggi ngln terceptor"/>< in terceptorn ame="model-drive n"class=".ope nsymph ony .xwork2.i nterceptor.ModelDrive nln terceptor"/>< in terceptorn ame ="scoped-model-drive n"

26、class=".ope nsympho ny .xwork2.i nterceptor.ScopedModelDrive nln terceptor"/>< in terceptorn ame ="params"class=".ope nsymph on y.xwork2.i nterceptor.Parametersl nterceptor"<in terceptor/>n ame ="prepare"class=".ope nsympho ny.xwork2.i ntercep

27、tor.PrepareIn terceptor"< in terceptor/>n ame="static-params"class=".ope nsympho ny.xwork2.i nterceptor.StaticParametersI nterceptor"/>< in terceptorn ame="scope"class="org.apache.struts2.in terceptor.ScopeI nterceptor"/>< in terceptorn

28、ame="servlet-c on fig"class ="org.apache.struts2.i nterceptor.ServletC on figI nterceptor"/>< in terceptorn ame="sessi on Autowiri ng"class="org.apache.struts2.spri ng.i nterceptor.Sessio nCon textAutowir in gI nterceptor"/>< in terceptorn ame=&quo

29、t;timer"class=".open sympho ny.xwork2.i nterceptor.Timerl nterceptor"/>< in terceptorn ame="toke n"class="org.apache.struts2.in terceptor.Toke nln terceptor"/>< in terceptorn ame="toke n-sessi on"class ="org.apache.struts2.i nterceptor.To

30、ken Sessio nStorel nterceptor"/>< in terceptorn ame="validati on"class=".ope nsympho ny.xwork2.validator.Validationln terceptor"/>< in terceptorn ame="workflow"class=".ope nsympho ny.xwork2.i nterceptor.DefaultWorkflowI nterceptor"/>< in

31、 terceptorn ame="store"class="org.apache.struts2.in terceptor.MessageStoreI nterceptor"/>< in terceptorn ame="checkbox"class="org.apache.struts2.i nterceptor.CheckboxIn terceptor"/>< in terceptorn ame="profili ng"class="org.apache.st

32、ruts2.i nterceptor.Profilin gActivati onln terceptor"/>7. 一旦Action 执行完毕,Actionlnvocation负责根据struts.xml中的配置找到对应的返回结果。如上文中将结构返回"add.jsp ”,但大部分时候都是返回另外一个action ,那么流程又得走一遍Struts2/XWork远程命令执行漏洞POC2010-12-04struts2 一种java-web的MVC框架技术,和传统的strutsl 有很大的 改进。struts2二struts +WebWork 。WebWor是由 OpenS

33、ymphon组织开发的,致力于组件化和代码重用的拉出式 MVC模式J2EE Web框架。WebWork 目前最新版本是2.1,现在的 WebWork2.x前身是Rickard Oberg开发 的WebWor,但现在 WebWor已经被拆分成了 Xwork1和 WebWork2两 个项目。XWork是一个标准的Comman模 式实现,并且完全从web层 脱离出来。Xwork提供了很多核心功能:前端拦+截器(interceptor ),运行时 表单属性验证,类型转换,强大的表达式语言(OGNL- the ObjectGraph Navigation Language ) , IoC (Inversion of Control倒置控制)容器等。其目的是:创建一个泛化的、可重用且可扩展的命令模 式框架,而不是一个特定在某个领域使用的框架。XWork存在远程命 令 执行漏洞。田info:Friday, July 9, 2010CVE-2010-1870:Struts2/XWork remote comma

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论