




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
这是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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度短期劳务合同(社区服务工作者)
- Unit 3 Writing Home Lesson 18 Little Zeke Sends an Email同步练习(含答案含听力原文无音频)
- 二零二五年度酒店管理分公司合作经营合同
- 二零二五年度海外网络安全与数据科学留学合同
- 二零二五年度制造业生产线劳务派遣服务协议
- 低油价发言稿
- 2025年梅州货物运输驾驶员从业资格考试系统
- 2025年成都货运从业资格证模拟考试题库
- 哪吒开学心理调适(初三)课件
- 农业产业化技术支持方案
- 2025年怀化师范高等专科学校单招职业技能测试题库带答案
- 2025年湖北幼儿师范高等专科学校单招职业技能测试题库含答案
- 2025年广东生态工程职业学院单招职业适应性测试题库完美版
- 模具转移合同协议书
- 政治-贵州省贵阳市2025年高三年级适应性考试(一)(贵阳一模)试题和答案
- 公司副总经理英文简历
- DeepSeek学习科普专题
- 2025浙江杭州地铁运营分公司校园招聘665人易考易错模拟试题(共500题)试卷后附参考答案
- 2025四川省小金县事业单位招聘362人历年高频重点模拟试卷提升(共500题附带答案详解)
- 2022泛海三江消防ZX900液晶手动控制盘使用手册
- 广西壮族自治区柳州市2025年中考物理模拟考试卷三套附答案
评论
0/150
提交评论