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

下载本文档

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

文档简介

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

一个请求在Struts2框架中的处理大概分为以下几个步骤1.

客户端提起一个(ServletRequest)请求,如上文在浏览器中输入”://localhost:8080/TestMvc/add.action”就是提起一个(ServletRequest)请求。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

{

ServletRequest

request

=

(ServletRequest)

req;

ServletResponse

response

=

(ServletResponse)

res;

ServletContext

servletContext

=

filterConfig.getServletContext();

//

在这里处理了ServletRequest和ServletResponse。

DispatcherUtils

du

=

DispatcherUtils.getInstance();

du.prepare(request,

response);//正如这个方法名字一样进行locale、encoding以及特殊request

parameters设置

try

{

request

=

du.wrapRequest(request,

servletContext);//对request进行包装

}

catch

(IOException

e)

{

String

message

=

"Could

not

wrap

servlet

request

with

MultipartRequestWrapper!";

LOG.error(message,

e);

throw

new

ServletException(message,

e);

}

ActionMapperIF

mapper

=

ActionMapperFactory.getMapper();//得到action的mapper

ActionMapping

mapping

=

mapper.getMapping(request);//

得到action

mapping

if

(mapping

==

null)

{

//

there

is

no

action

in

this

request,

should

we

look

for

a

static

resource?

String

resourcePath

=

RequestUtils.getServletPath(request);

if

("".equals(resourcePath)

&&

null

!=

request.getPathInfo())

{

resourcePath

=

request.getPathInfo();

}

if

("true".equals(Configuration.get(WebWorkConstants.WEBWORK_SERVE_STATIC_CONTENT))

&&

resourcePath.startsWith("/webwork"))

{

String

name

=

resourcePath.substring("/webwork".length());

findStaticResource(name,

response);

}

else

{

//

this

is

a

normal

request,

let

it

pass

through

chain.doFilter(request,

response);

}

//

WW

did

its

job

here

return;

}

Object

o

=

null;

try

{

//setupContainer(request);

o

=

beforeActionInvocation(request,

servletContext);

//整个框架最最核心的方法,下面分析

du.serviceAction(request,

response,

servletContext,

mapping);

}

finally

{

afterActionInvocation(request,

servletContext,

o);

ActionContext.setContext(null);

}

}

du.serviceAction(request,

response,

servletContext,

mapping);

//这个方法询问ActionMapper是否需要调用某个Action来处理这个(request)请求,如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy

public

void

serviceAction(ServletRequest

request,

ServletResponse

response,

String

namespace,

String

actionName,

Map

requestMap,

Map

parameterMap,

Map

sessionMap,

Map

applicationMap)

{

HashMap

extraContext

=

createContextMap(requestMap,

parameterMap,

sessionMap,

applicationMap,

request,

response,

getServletConfig());

//实例化Map请求

,询问ActionMapper是否需要调用某个Action来处理这个(request)请求

extraContext.put(SERVLET_DISPATCHER,

this);

OgnlValueStack

stack

=

(OgnlValueStack)

request.getAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY);

if

(stack

!=

null)

{

extraContext.put(ActionContext.VALUE_STACK,new

OgnlValueStack(stack));

}

try

{

ActionProxy

proxy

=

ActionProxyFactory.getFactory().createActionProxy(namespace,

actionName,

extraContext);

//这里actionName是通过两道getActionName解析出来的,

FilterDispatcher把请求的处理交给ActionProxy,下面是ServletDispatcher的

TODO:

request.setAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY,

proxy.getInvocation().getStack());

proxy.execute();

//通过代理模式执行ActionProxy

if

(stack

!=

null){

request.setAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY,stack);

}

}

catch

(ConfigurationException

e)

{

log.error("Could

not

find

action",

e);

sendError(request,

response,

ServletResponse.SC_NOT_FOUND,

e);

}

catch

(Exception

e)

{

log.error("Could

not

execute

action",

e);

sendError(request,

response,

ServletResponse.SC_INTERNAL_SERVER_ERROR,

e);

}

}

4.

FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个(request)请求,如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy。5.

ActionProxy通过ConfigurationManager(struts.xml)询问框架的配置文件,找到需要调用的Action类.

如上文的struts.xml配置<?xml

version="1.0"

encoding="GBK"?>

<!DOCTYPE

struts

PUBLIC

"-//Apache

Software

Foundation//DTD

Struts

Configuration

2.0//EN"

":///dtds/struts-2.0.dtd">

<struts>

<include

file="struts-default.xml"/>

<package

name="struts2"

extends="struts-default">

<action

name="add"

class="edisundong.AddAction"

>

<result>add.jsp</result>

</action>

</package>

</struts>

如果提交请求的是add.action,那么找到的Action类就是edisundong.AddAction。6.

ActionProxy创建一个ActionInvocation的实例,同时ActionInvocation通过代理模式调用Action。但在调用之前ActionInvocation会根据配置加载Action相关的所有Interceptor。(Interceptor是struts2另一个核心级的概念)下面我们来看看ActionInvocation是如何工作的:

ActionInvocation

是Xworks

中Action

调度的核心。而对Interceptor

的调度,也正是由ActionInvocation负责。

ActionInvocation

是一个接口,

而DefaultActionInvocation

则是Webwork

对ActionInvocation的默认实现。

Interceptor

的调度流程大致如下:

1.

ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor。

2.

通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。

Interceptor将很多功能从我们的Action中独立出来,大量减少了我们Action的代码,独立出来的行为具有很好的重用性。XWork、WebWork的许多功能都是有Interceptor实现,可以在配置文件中组装Action用到的Interceptor,它会按照你指定的顺序,在Action执行前后运行。

那么什么是拦截器。

拦截器就是AOP(Aspect-Oriented

Programming)的一种实现。(AOP是指用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。)

拦截器的例子这里就不展开了。

struts-default.xml文件摘取的内容:

<

interceptor

name

="alias"

class

="erceptor.AliasInterceptor"

/>

<

interceptor

name

="autowiring"

class

="erceptor.ActionAutowiringInterceptor"

/>

<

interceptor

name

="chain"

class

="erceptor.ChainingInterceptor"

/>

<

interceptor

name

="conversionError"

class

="erceptor.StrutsConversionErrorInterceptor"

/>

<

interceptor

name

="createSession"

class

="erceptor.CreateSessionInterceptor"

/>

<

interceptor

name

="debugging"

class

="erceptor.debugging.DebuggingInterceptor"

/>

<

interceptor

name

="external-ref"

class

="erceptor.ExternalReferencesInterceptor"

/>

<

interceptor

name

="execAndWait"

class

="erceptor.ExecuteAndWaitInterceptor"

/>

<

interceptor

name

="exception"

class

="erceptor.ExceptionMappingInterceptor"

/>

<

interceptor

name

="fileUpload"

class

="erceptor.FileUploadInterceptor"

/>

<

interceptor

name

="i18n"

class

Interceptor"

/>

<

interceptor

name

="logger"

class

="erceptor.LoggingInterceptor"

/>

<

interceptor

name

="model-driven"

class

="erceptor.ModelDrivenInterceptor"

/>

<

interceptor

name

="scoped-model-driven"

class

="erceptor.ScopedModelDrivenInterceptor"

/>

<

interceptor

name

="params"

class

="erceptor.ParametersInterceptor"

/>

<

interceptor

name

="prepare"

class

="erceptor.PrepareInterceptor"

/>

<

interceptor

name

="static-params"

class

="erceptor.StaticParametersInterceptor"

/>

<

interceptor

name

="scope"

class

="erceptor.ScopeInterceptor"

/>

<

interceptor

name

="servlet-config"

class

="erceptor.ServletConfigInterceptor"

/>

<

interceptor

name

="sessionAutowiring"

class

="erceptor.SessionContextAutowiringInterceptor"

/>

<

interceptor

name

="timer"

class

="erceptor.TimerInterceptor"

/>

<

interceptor

name

="token"

class

="erceptor.TokenInterceptor"

/>

<

interceptor

name

="token-session"

class

="erceptor.TokenSessionStoreInterceptor"

/>

<

interceptor

name

="validation"

class

="com.opensymphony.xwork2.validator.ValidationInterceptor"

/>

<

interceptor

name

="workflow"

class

="erceptor.DefaultWorkflowInterceptor"

/>

<

interceptor

name

="store"

class

="erceptor.MessageStoreInterceptor"

/>

<

interceptor

name

="checkbox"

class

="erceptor.CheckboxInterceptor"

/>

<

interceptor

name

="profiling"

class

="erceptor.ProfilingActivationInterceptor"

/>

7.

一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。如上文中将结构返回“add.jsp”,但大部分时候都是返回另外一个action,那么流程又得走一遍………

Struts2/XWork远程命令执行漏洞POC别20趋10鞋-1写2-虽04昆st创ru鞋ts霸2险一种垂ja匙va号-w帜eb况的诊MV坦C葡框架听技术厦,和丛传统椅的豪st己ru肿ts获1赠有很爪大的佳改进唐。

赴st退ru纤ts会2=腔st朋ru朝ts楚+星We撒bW湿or击k拌。掠We笨bW疼or灰k毛是由股Op馋en驱Sy胆mp斥ho绝ny鲜组织匪开发且的,慢致力秃于组申件化暴和代剂码重聚用的浓拉出厕式其MV汪C滨模式悉J2允EE坑W陈eb视框架偶。竞We赵bW葛or谈k果目前拖最新藏版本虏是胞2.扎1米,现棕在的蛾We拜bW古or既k2挥.x亏前身舟是痰Ri读ck趴ar盆d汇Ob昆er本g靠开发托的狐We数bW瑞or香k良,但薯现在勾We露bW纠or前k蜜已经居被拆器分成倡了愚Xw肃or凉k1聋和育We围bW云or台k2踩两个左项目遇。圈XW萌or梦k赵是一意个标阵准的诉Co淹mm稻an颠d命模挤馋式实罚现,床并且庸完全丛从袜w浅eb布层脱僻离出贼来。

碗Xw仔or拣k啄提供洪了很偿多核医心功互能:赌前端烟拦孙+父截器粱(遮in财te够rc南ep把to弃r铅),喝运行咏时表贼单属邀性验搅证,前类型仆转换黄,强智大的识表达甩式语绞言(纽OG右NL活–从t庙he继O枝bj屡ec号t偏Gr惭ap残h满Na乱vi恳ga灵ti股on说L伶an春gu椒ag端e勇),券Io死C犁(肺In碑ve耗rs坦io密n险of对C甩on尾tr损ol杜倒置资控制言)容笛器等宵。其打目的客是:典创建维一个淹泛化菜的、伐可重饲用且圆可扩个展的统命令缎模式技框架悟,而秩不是料一个堪特定接在某弱个领享域使壤用的撇框架途。目XW狠or运k唇存在学远程未命谨郊令执民行司漏洞兼。学[+裂]i迎nf耕o:

隐~~通~~娇~~糠~~拜~

稠Fr予id瞧ay规,种Ju蚀ly悔9扑,爆20顶10

荡CV惹E-秒20垫10制-1谷87爷0:晃

辉St祥ru块ts司2/统XW显or愿k肥

蓬re裳mo骂te当c兵om副ma望nd艘e画xe抗cu健ti炭on鼠[+耀]p猫oc己:

唯~~喉~~肃~~舌~~臂~

串Ac眼tu滤al拖p丽ro绿of抄o众f歌co乎nc贱ep肆t鉴ha侵d植to磨u抛se耀O设GN秀L’至s毕ex愤pr厅es掀si甩on兰e迁va灰lu势at互io蝴n易wh隶en嫌c摄ra驴ft蛋in拔g午HT劈TP敢r馆eq躬ue惕st拴.懒Po冬C签fo肉r中th渴is径b贸ug性w伟il勇l扰be且p姻ub蜓li州sh稳ed烧o符n丽Ju初ly塌1晌2课20协10告.道To捐t博es姨t诉wh京et还he绵r烟yo慎ur事a书pp醒li惜ca迅ti海on言i胞s疤vu拴ln么er屿ab牺le盖y纷ou区c女an糟u寿se留t工he花f走ol千lo档wi哲ng行p黄ro读of旧o浪f白co晨nc波ep舞t,医w绢hi痕ch劫w侵il骨l唤ca韵ll欧j你av怪a.因la旗ng呆.R稼un盼ti韵me鼓.g旺et武Ru余nt层im涛e(咬).详ex乔it绸(1辽):怜ht盏tp漠:/女/m和yd尤om芒ai丙n/秤My耍St聋ru涂ts桌.a底ct历io涌n?雄(‘月u0陈02楼3_聪me烦mb项er谣Ac

温馨提示

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

评论

0/150

提交评论