Struts2原理及源码分析

CSRF 原理以及 Struts2 令牌校验防御攻略解析 阅读详情
  • struts介绍
    strtus2是WebWork的升级版,是一个运行稳定、性能优异、设计成熟的web框架,而struts则实现了MVC思想中的controller模块,而控制器实际上是由两部分组成,即拦截所有用户的请求,处理请求的通用代码都是由核心控制器完成的。在struts框架下,用户请求不再向JSP页面发送,而是由控制器StrutsPrepareAndExceptionFilter来将请求forword到指定JSP页面生成响应。

  • struts原理流程

    • 客户端初始化一个指向Servlet容器的请求
    • 这个请求经过一个系列的过滤器
    • StrutsPrepareAndExcuteFilter被调用,它会询问ActionMapper来决定这个请求调用某个Action
    • ActionMapper决定调用那个action,FilterDispatcher把请求的处理交给ASctionProxy
    • ActionProxy通过调用Configuration Manager询问框架的配置文件,找到需要调用的Action类
    • 创建ActionInvocation的实例
    • ActionInvocation实例使用命名模式来调用,在调用Acion的过程前后都会涉及到相关的拦截器(intercepter)的调用
    • 一旦action执行完毕,ActionInvocation负责根据struts.xml的配置找到相应的返回对应的返回结果,这个结果是一个需要被表示的JSP
  • FilterDispatcher

    • struts的核心过滤器,负责处理最初的请求
    • 四大责任:
      • 执行action:判断是否需要执行action,需要执行则该action则应该放在核心过滤器的最前面
      • 清空actionContext上下文:自动清理,确保没有内存泄露
      • 服务静态的内容:加载常用的javascript文件
      • 中断请求生命周期中的XWORKS拦截器
  • ActionMapper

    • 用来负责在Http请求和action调用之间进行一个映射
    • 为了帮助处理按钮和其他相关的需求,这个mapper(我们希望,其他ActionMapper也能这样)具有这样的功能:使用一些预定义的前缀命名一个按钮,这些按钮会引发执行行为.这四个前缀是:
      Method 前缀- method:default
      Action 前缀- action:dashboard
      Redirect 前缀- redirect:cancel.jsp
      Redirect-action 前缀- redirect-action:cancel

      除了这四个前缀,这个mapper也明白 foo!bar的action命名方式,或者扩展方式(例如 foo!bar.action) ,或者前缀方式(例如 action:foo!bar).这个语法告诉mapper映射到名称为foo的action和对应的方法bar.
      
      实现自己的ActionMapper,通过method参数将请求转发到具体的action,需继承DefaultActionMapper
      
  • ActionProxy&ActionInvocation

    • Action的一个代理,由ActionProxyFactory创建,它本身不包括Action实例,默认实现DefaultActionProxy是由ActionInvocation持有Action实例。ActionProxy作用是如何取得Action,无论是本地还是远程。而ActionInvocation的作用是如何执行Action,拦截器的功能就是在ActionInvocation中实现的。
  • ConfigurationProvider&Configuration

    • ConfigurationProvider就是Struts2中配置文件的解析器,Struts2中的配置文件主要是尤其实现类XmlConfigurationProvider及其子类StrutsXmlConfigurationProvider来解析。
  • trutsPrepareAndExecuteFilter中的方法:

    • void init(FilterConfig filterConfig) 继承自Filter,过滤器的初始化
    • doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 继承自Filter,执行过滤器
    • void destroy() 继承自Filter,用于资源释放
    • void postInit(Dispatcher dispatcher, FilterConfig filterConfig) Callback for post initialization(一个空的方法,用于方法回调初始化)

web容器一启动,就会初始化核心过滤器StrutsPrepareAndExecuteFilter,并执行初始化方法,初始化方法如下:

复制代码
1 public void init(FilterConfig filterConfig) throws ServletException {
2 InitOperations init = new InitOperations();
3 Dispatcher dispatcher = null;
4 try {
5 //封装filterConfig,其中有个主要方法getInitParameterNames将参数名字以String格式存储在List中
6 FilterHostConfig config = new FilterHostConfig(filterConfig);
7 //初始化struts内部日志
8 init.initLogging(config);
9 //创建dispatcher ,并初始化
10 dispatcher = init.initDispatcher(config);
11 init.initStaticContentLoader(config, dispatcher);
12 //初始化类属性:prepare 、execute
13 prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher);
14 execute = new ExecuteOperations(filterConfig.getServletContext(), dispatcher);
15 this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);
16 //回调空的postInit方法
17 postInit(dispatcher, filterConfig);
18 } finally {
19 if (dispatcher != null) {
20 dispatcher.cleanUpAfterInit();
21 }
22 init.cleanup();
23 }
24 }
复制代码
关于封装filterConfig,首先看下FilterHostConfig ,源码如下:

复制代码
1 public class FilterHostConfig implements HostConfig {
2
3 private FilterConfig config;
4 //构造方法
5 public FilterHostConfig(FilterConfig config) {
6 this.config = config;
7 }
8 //根据init-param配置的param-name获取param-value的值
9 public String getInitParameter(String key) {
10 return config.getInitParameter(key);
11 }
12 //返回初始化参数名的迭代器
13 public Iterator getInitParameterNames() {
14 return MakeIterator.convert(config.getInitParameterNames());
15 }
16 //返回Servlet上下文
17 public ServletContext getServletContext() {
18 return config.getServletContext();
19 }
20 }
复制代码
  只有短短的几行代码,getInitParameterNames是这个类的核心,将Filter初始化参数名称有枚举类型转为Iterator。此类的主要作为是对filterConfig 封装。

  接下来,看下StrutsPrepareAndExecuteFilter中init方法中dispatcher = init.initDispatcher(config);这是初始化dispatcher的,是通过init对象的initDispatcher方法来初始化的,init是InitOperations类的对象,我们看看InitOperations中initDispatcher方法:

1 public Dispatcher initDispatcher( HostConfig filterConfig ) {
2 Dispatcher dispatcher = createDispatcher(filterConfig);
3 dispatcher.init();
4 return dispatcher;
5 }
  创建Dispatcher,会读取 filterConfig 中的配置信息,将配置信息解析出来,封装成为一个Map,然后根绝servlet上下文和参数Map构造Dispatcher :

复制代码
1 private Dispatcher createDispatcher( HostConfig filterConfig ) {
2 //存放参数的Map
3 Map

深入Struts2框架:源码解读与实践指南 本文还有配套的精品资源,点击获取 简介:Struts2是一个基于MVC模式的Java Web框架,本课程通过分析Struts2项目的关键文件和目录结构,帮助学习者理解其工作原理和开发细节。课程内容涉及 .classpath 、 .mymetadata 、 .project 、 .settings 和 .myec... 阅读详情

相关推荐

深入分析Struts2程序源码

本文还有配套的精品资源,点击获取 简介:Struts2是一个基于MVC设计模式的开源Java Web框架,由Apache软件基金会维护。它继承并改进了Struts1,提供了强大的功能和灵活性,以构建高效且易于维护的Web应用。本文深入剖析Struts2的核心架构、配置机制、ActionMapping、ValueStack、Tiles集成、国际化支持、异常处理、安全防护以及与...

weixin_28933797的博客 1026

struts2 项目源代码

北大青鸟 struts2 项目源代码 值得一看

Struts2源码分析

Strut2源码分析,写的非常好, 喜欢Struts2的人可以看一看

struts2源代码分析

1. Struts2架构图 请求首先通过Filter chain,Filter主要包括ActionContextCleanUp,它主要清理当前线程的ActionContext和Dispatcher;FilterDispatcher主要通过AcionMapper来决定需要调用哪个Action。         ActionMapper取得了ActionMapping后,在Dispatcher

mq1097762241的专栏 755

Struts2 源码分析-----工作原理分析

请求过程 struts2 架构图如下图所示: 依照上图,我们可以看出一个请求在struts的处理大概有如下步骤:   1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;   2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteM...

weixin_33955681的博客 210

struts2源码分析及拦截器实现原理

一:拦截器(interceptor)简介 拦截器(interceptor)是struts2中的最重要的核心之一,是Struts2最强大的特性之一。拦截器可以让你在Action和result被执行之前或之后进行一些处理。同时,拦截器也可以让你将通用的代码模块化并作为可重用的类。Struts2中的很多特性都是由拦截器来完成的。拦截是AOP的一种实现策略。在Webwork的中文文档的解释为:拦截器是动

alexpdh的博客 729

源码分析struts2中返回json数据的原理

前面一篇文章其实只是介绍了如何在Struts2中返回JSON数据到客户端的具体范例而无关其原理,内容与标题不符惹来标题党嫌疑确实是笔者发文不够严谨,目前已修改标题,与内容匹配。本文将从struts2-json插件的源码角度出发,结合之前的应用范例来说明struts2-json插件返回JSON数据的原理。   用winrar打开struts2-json-plugin-xx.jar(笔者使用版本为

u010214269的专栏 1322

Struts2的工作原理(源码分析)

本章讲述Struts2的工作原理。   读者如果曾经学习过Struts1.x或者有过Struts1.x的开发经验,那么千万不要想当然地以为这一章可以跳过。实际上Struts1.x与Struts2并无我们想象的血缘关系。虽然Struts2的开发小组极力保留Struts1.x的习惯,但因为Struts2的核心设计完全改变,从思想到设计到工作流程,都有了很大的不同。   Struts2Struts

fighter_hua的专栏 644

Struts2工作流程图、原理源码分析---perfect

Struts2工作原理 Struts2请求响应流程:   在struts2的应用中,从用户请求到服务器返回相应响应给用户端的过程中,包含了许多组件如:Controller、ActionProxy、ActionMapping、Configuration Manager、ActionInvocation、Inerceptor、Action、Result等。下面我们来具体看看这些组件有

洪文聊架构 3821

struts2 源码绝对完整

struts2 源码绝对完整,struts2 源码绝对完整。

Struts2框架的简单回顾和源码分析

Struts2框架的简单回顾和源码分析 Strtus2框架,是基于MVC开发模式的表现层框架 作用可以说和servlet相同,作为页面和java代码之间数据交互的桥梁

struts2 源码解读

NULL 博文链接:https://tpsnake.iteye.com/blog/1566327

struts2源码分析-IOC容器的实现机制(下篇)

以前看到一篇关于struts2-IOC容器实现的源码分析的博客(上篇),写得很经典,自己也从中了解了很多关于struts2-IOC容器初始化的东西,如果容器托管对象是什么,节点中为什么有了type属性还要有name属性,ContainerBuilder构建Container原理等。可惜博主只写了上篇,主要是讲解了IOC容器的初始化过程,而对从容器中获取容器托管对象以及注入原理一笔带过了。虽然博主说

云原生之家 1471

Struts2中的setDefaultLocale的实现

struts2中可以在struts.properties文件中设置default local。如:struts.locale=zh_CN 查看源代码发现他是通过annotation Inject来设置的。 @Inject(value=StrutsConstants.STRUTS_LOCALE, required=false) public static void setDe...

fannk的博客 355

struts2工作机制及源码分析

推荐两篇不错的struts2源码分析文章: http://www.blogjava.net/lzhidj/archive/2008/07/10/213898.html http://www.blogjava.net/myyate/articles/Struts2_source_java.html 入门教程:http://java.chinaitlab.com/special/struts2/...

enetor1的专栏 159

Struts2源码分析--请求处理

Struts2源码分析--请求处理 http://www.iteye.com/topic/450979

ainiyiwannian2046的博客 174
上一篇: express模块的理解
下一篇: JavaSE大总结
wxryzq
博客等级 码龄11年 2粉丝 18原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值