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

下载本文档

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

文档简介

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

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

3、rres,FiilteerChhainnchhainn)tthroowsIOEExceeptiion,SeervlletEExceeptiionHtttpSeervlletRRequuesttreequeest=(HtttpSeervlletRRequuestt)rreq;HHttppSerrvleetReespoonseereespoonsee=(HtttpSServvlettRessponnse)rees;SeervlletCConttexttseervlletCConttextt=fillterrConnfigg.geetSeervlletCConttextt();/在在这里处处理了HH

4、ttppSerrvleetReequeest和和HtttpSeervlletRRespponsse。DDisppatccherrUtiilsdu=DDisppatccherrUtiils.gettInsstannce();duu.prrepaare(reqquesst,ressponnse);/正如这这个方法法名字一一样进行行loccalee、enccodiing以以及特殊殊reqquesstpparaametterss设置tryyreequeest=ddu.wwrappReqquesst(rrequuestt,sservvlettConntexxt);/对reqquesst进行行包装catt

5、ch(IOOExccepttionne)SStriingmesssagge=CCoulldnnotwraapsservvlettreequeestwitthMMulttipaartRRequuesttWraappeer!;LOOG.eerroor(mmesssagee,ee);tthroownewwSeervlletEExceeptiion(messsagge,e);AcctioonMaappeerIFFmaappeer=AcctioonMaappeerFaactoory.gettMappperr();/得到到acttionn的mappperrAActiionMMapppinggmaappii

6、ng=mmappper.gettMapppinng(rrequuestt);/得得到acctioon的的maappiingiff(mmapppingg=nuull)/ttherreiisnnoaactiioninthiisrrequuestt,sshouuldweloookfforasstatticressourrce?StrringgreesouurceePatth=ReequeestUUtills.ggetSServvlettPatth(rrequuestt);iif(.equualss(reesouurceePatth)&nulll!=rrequuestt.geetPaathIInfoo

7、()ressourrcePPathh=reqquesst.ggetPPathhInffo();iif(trrue.eqqualls(CConffiguurattionn.geet(WWebWWorkkConnstaantss.WEEBWOORK_SERRVE_STAATICC_COONTEENT)&reesouurceePatth.sstarrtsWWithh(/webbworrk)Sttrinngnnamee=ressourrcePPathh.suubsttrinng(/weebwoork.leengtth();finndSttatiicReesouurcee(naame,reespoons

8、ee);ellse/tthississanorrmallreequeest,leetiitppasssthhrouughchaain.doFFiltter(reqquesst,ressponnse);/WWWddiditssjoobhhereeretturnn;OObjeecto=nuull;ttry/settupCConttainner(reqquesst);o=beeforreAcctioonInnvoccatiion(reqquesst,serrvleetCoonteext);/整个框框架最最最核心的的方法,下面分分析duu.seerviiceAActiion(reqquesst,res

9、sponnse,seervlletCConttextt,mmapppingg);finnalllyaftterAActiionIInvoocattionn(reequeest,seervlletCConttextt,oo);AActiionCConttextt.seetCoonteext(nulll);ddu.sservviceeActtionn(reequeest,reespoonsee,sservvlettConntexxt,mapppinng);/这个个方法询询问AcctioonMaappeer是否否需要调调用某个个Acttionn来处理理这个(reqquesst)请请求,如如果Acct

10、ioonMaappeer决定定需要调调用某个个Acttionn,FillterrDisspattcheer把请请求的处处理交给给ActtionnProoxyppubllicvoiidsservviceeActtionn(HtttpSServvlettReqquesstrrequuestt,HHttppSerrvleetReespoonseereespoonsee,SStriingnammesppacee,SStriingacttionnNamme,MappreequeestMMap,MaappparaametterMMap,MaapssesssionnMapp,MMapapppliccatii

11、onMMap)HHashhMappexxtraaConntexxt=crreatteCoonteextMMap(reqquesstMaap,parrameeterrMapp,ssesssionnMapp,aappllicaatioonMaap,reqquesst,ressponnse,geetSeervlletCConffig();/实例例化Maap请求求,询问问ActtionnMappperr是否需需要调用用某个AActiion来来处理这这个(rrequuestt)请求求eextrraCoonteext.putt(SEERVLLET_DISSPATTCHEER,thiis);OgnnlVaa

12、lueeStaackstaack=(OgnnlVaalueeStaack)reequeest.gettAtttribbutee(SeervlletAActiionCConttextt.WEEBWOORK_VALLUESSTACCK_KKEY);iff(sstacck!=nnulll)exxtraaConntexxt.pput(ActtionnConntexxt.VVALUUE_SSTACCK,nnewOgnnlVaalueeStaack(staack);tryyActtionnProoxyprooxy=AActiionPProxxyFaactoory.gettFacctorry().crrea

13、tteAcctioonPrroxyy(naamesspacce,acttionnNamme,exttraCConttextt);/这里里acttionnNamme是通通过两道道gettActtionnNamme解析析出来的的,FFiltterDDisppatccherr把请求求的处理理交给AActiionPProxxy,下下面是SServvlettDisspattcheer的TOODO:reequeest.settAtttribbutee(SeervlletAActiionCConttextt.WEEBWOORK_VALLUESSTACCK_KKEY,prroxyy.geetInnvoccat

14、iion().ggetSStacck();prooxy.exeecutte();/通过过代理模模式执行行ActtionnProoxyiif(staack!=nulll)rrequuestt.seetAtttriibutte(SServvlettActtionnConntexxt.WWEBWWORKK_VAALUEESTAACK_KEYY,sttackk);cattch(CoonfiigurratiionEExceeptiione)llog.errror(Cooulddnootffinddacctioon,e);ssenddErrror(reqquesst,ressponnse,HtttpSSe

15、rvvlettRessponnse.SC_NOTT_FOOUNDD,ee);caatchh(EExceeptiione)llog.errror(Cooulddnooteexeccuteeacctioon,e);ssenddErrror(reqquesst,ressponnse,HtttpSServvlettRessponnse.SC_INTTERNNAL_SERRVERR_ERRRORR,ee);4.FillterrDisspattcheer询问问ActtionnMappperr是否需需要调用用某个AActiion来来处理这这个(rrequuestt)请求求,如果果ActtionnMapppe

16、rr决定需需要调用用某个AActiion,FillterrDisspattcheer把请请求的处处理交给给ActtionnProoxy。5.ActtionnProoxy通通过Coonfiigurratiion Mannageer(strrutss.xmml)询询问框架架的配置置文件,找到需需要调用用的Acctioon类.如上文文的sttrutts.xxml配配置addd.jssp 如如果提交交请求的的是addd.aactiion,那么找找到的AActiion类类就是eedissunddongg.AdddAcctioon。6.ActtionnProoxy创创建一个个ActtionnInvvoca

17、atioon的实实例,同同时AcctioonInnvoccatiion通通过代理理模式调调用Acctioon。但但在调用用之前AActiionIInvoocattionn会根据据配置加加载Acctioon相关关的所有有Intterccepttor。(Innterrcepptorr是sttrutts2另另一个核核心级的的概念)下面我们们来看看看ActtionnInvvocaatioon是如如何工作作的:AActiionIInvoocattionn是Xwoorkss中Acttionn调度度的核心心。而对对Intterccepttor的调度度,也正正是由AActiionIInvoocattionn负

18、责。ActtionnInvvocaatioon是是一个接接口,而DeffaulltAcctioonInnvoccatiion则是Weebwoork对ActtionnInvvocaatioon的默默认实现现。Innterrcepptorr的调调度流程程大致如如下:11.AActiionIInvoocattionn初始化化时,根根据配置置,加载载Acttionn相关的的所有IInteerceeptoor。2.通过AcctioonInnvoccatiion.invvokee方法调调用Acctioon实现现时,执执行Innterrcepptorr。Intterccepttor 将很多多功能从从我们的的

19、Acttionn中独立立出来,大量减减少了我我们Acctioon的代代码,独独立出来来的行为为具有很很好的重重用性。XWoork、WebbWorrk的许许多功能能都是有有Intterccepttor实实现,可可以在配配置文件件中组装装Acttionn用到的的Intterccepttor,它会按按照你指指定的顺顺序,在在Acttionn执行前前后运行行。那么么什么是是拦截器器。拦截截器就是是AOPP(Asppectt-OrriennteddPrrogrrammmingg)的一一种实现现。(AAOP是是指用于于在某个个方法或或字段被被访问之之前,进进行拦截截然后在在之前或或之后加加入某些些操作。)

20、拦截截器的例例子这里里就不展展开了。strrutss-deefauult.xmll文件摘摘取的内内容:7.一旦AActiion执执行完毕毕,AcctioonInnvoccatiion负负责根据据strrutss.xmml中的的配置找找到对应应的返回回结果。如上文文中将结结构返回回“addd.jjsp”,但大大部分时时候都是是返回另另外一个个acttionn,那么么流程又又得走一一遍Struuts22/XWWorkk 远程程命令执执行漏洞洞POCC20100-122-044struuts22一种 HYPERLINK /post/tag/java-web o 查看 java-web 的全部文章 j

21、aava-webb的 HYPERLINK /post/tag/mvc o 查看 MVC 的全部文章 MVCC框架技技术,和和传统的的strrutss1有很很大的改改进。struuts22=sttrutts +WebbWorrk。WebbWorrk是由由OpeenSyymphhonyy组织开开发的,致力于于组件化化和代码码重用的的拉出式式 HYPERLINK /post/tag/mvc o 查看 MVC 的全部文章 MVCC模式J22EE Webb框架。WebbWorrk目前前最新版版本是22.1,现在的的WebbWorrk2.x前身身是Riickaard Obeerg开开发的WWebWWork

22、k,但现现在WeebWoork已已经被拆拆分成了了Xwoork11和WebbWorrk2两两个项目目。XWWorkk是一个个标准的的Commmannd模式实现现,并且且完全从从 weeb层脱脱离出来来。Xworrk提供供了很多多核心功功能:前前端拦+截器(intterccepttor),运行行时表单单属性验验证,类类型转换换,强大大的表达达式语言言(OGGNL tthe Objjectt Grraphh Naaviggatiion Lannguaage),IooC(Invverssionn off Coontrrol倒倒置控制制)容器器等。其其目的是是:创建建一个泛泛化的、可重用用且可扩扩展的

23、命命令模式式框架,而不是是一个特特定在某某个领域域使用的的框架。XWoork存存在远程程命令执执行 HYPERLINK /post/tag/%e6%bc%8f%e6%b4%9e o 查看 漏洞的全部文章 漏洞洞。+iinfoo:Frridaay, Jully 99, 220100CVEE-20010-18770: HYPERLINK /post/tag/struts2xwork o 查看Struts2/XWork 的全部文章 Strrutss2/XXWorrkremmotee coommaand exeecuttionn+ppoc:Acttuall prrooff off coonceept

24、hadd too usse OOGNLLs exppresssioon eevalluattionn whhen craaftiing HTTTP rrequuestt. PPoC forr thhis bugg wiill be pubblisshedd onn Juuly 12 20110. To tesst wwhettherr yoour apppliccatiion is vullnerrablle yyou cann usse tthe folllowwingg prrooff off coonceept, whhichh wiill calll jjavaa.laang.Runntimme.ggetRRunttimee().exiit(11):httpp:/myddomaain/MySStruuts.acttionn?(u00023_memmberrAcccesssaalloowSttatiicMeethoodAcccesss)(mehh)=ttruee&(aa

温馨提示

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

评论

0/150

提交评论