Struts2中有三大核心:ognl,拦截器和action;想要学好Struts2,这三个核心是重中之重;这里就给大家介绍一下Struts2拦截器的工作原理

什么是拦截器

拦截器是在请求到达Action前后进行的一系列操作,Struts2默认自带了很大拦截器,这些拦截器定义在struts-default.xml中。Struts2中的拦截器是基于AOP动态代理思想的。关于Struts的结构,有一张很经典的图:

在这张图上可以清楚的看到请求经过了Action代理,然后通过了一系列Interceptor最终返回,下面我们就来了解一下,图中的Interceptor1,2,3是如何工作的。

拦截器的工作原理

在搭建Struts2框架时,我们首先需要在web.xml中配置StrutsPrepareAndExecuteFilter过滤器,这是因为请求会首先经过这个过滤器,然后会经过很多层,最后依次经过每一个拦截器(包括自定义的拦截器)。具体经过了哪些层,可以看下面这张图:

从这张图可以看到每一层的包含关系,重点看一下最里面的两层,红色箭头和黄色箭头的部分,这两个方法是一个递归调用的过程,也就是说,当在invoke()方法中调用一个拦截器时,拦截器中会有invocation.invoke()这一句,这一句表明会跳出当前拦截器,回到上一级,调用下一个拦截器,当所有的拦截器都调用了并且action执行完毕后,会递归回调拦截器中没有执行完毕的内容。那么invoke()方法中是如何调用下一个拦截器的呢?看看源码就明白了(最核心的代码):

       if (interceptors.hasNext()) {final InterceptorMapping interceptorMapping = interceptors.next();String interceptorMsg = "interceptorMapping: " + interceptorMapping.getName();UtilTimerStack.push(interceptorMsg);try {Interceptor interceptor = interceptorMapping.getInterceptor();if (interceptor instanceof WithLazyParams) {interceptor = lazyParamInjector.injectParams(interceptor, interceptorMapping.getParams(), invocationContext);}resultCode = interceptor.intercept(DefaultActionInvocation.this);} finally {UtilTimerStack.pop(interceptorMsg);}} else {resultCode = invokeActionOnly();}

关于递归的过程,我自己画了一个示意图:

看完上面的解释,这时候再回去看一开始的struts框架结构图的interceptor1,2,3,应该可以很容易理解了。
以上就是我对拦截器的执行的理解,希望能够帮助到大家!

深入解析Struts拦截器的工作原理相关推荐

  1. Google Chrome 新广告拦截器的工作原理

    转自: https://www.ctrl.blog/entry/chrome-adblocker google chrome 将在2018年2月15日开始对某些网站上的广告进行屏蔽. 笔者看了一下Ch ...

  2. Struts2→拦截器、工作原理、拦截器计算Action执行时间、Struts2自带拦截器、拦截器栈

    工作原理 实现拦截器 样例 Struts2自带拦截器 拦截器栈(先进后出) TOKEN防表单重复提交 文字拦截器 AJAX

  3. struts2拦截器的实现原理及源码剖析

    拦截器(interceptor)是Struts2最强大的特性之一,也可以说是struts2的核心,拦截器可以让你在Action和result被执行之前或之后进行一些处理.同时,拦截器也可以让你将通用的 ...

  4. 利用Struts拦截器限制上传图片的格式和大小

    在这之前 Struts的一个核心功能就是大量的拦截器,既然是框架,那么自然也就贴心地为我们准备好了各种常用的功能,比如这里即将讨论的如何限制上传图片的格式和大小.那么既然是使用Struts已经写好的拦 ...

  5. ABP 拦截器不工作

    想写个拦截器,但是按照官方教程,发现自定义的拦截器不工作. 经过排查发现是需要顶要你要被拦截的方法为虚方法才能功能. 先贴两个链接. 后面再找解决办法 为什么我的拦截器不工作 为什么拦截器在non-v ...

  6. Struts 拦截器权限控制【通过拦截器实现登录后跳转到登录前页面】

    应用情形:在web项目中,经常会遇到用户未登录或SESSION失效时用户发出非法的权限操作,如新闻的评论.文件的下载等等,在此我们可以使用struts拦截器对该用户发出的请求进行拦截,拦截后判断用户是 ...

  7. struts拦截器+注解实现网络安全要求中的日志审计功能

    J2EE项目中出于安全的角度考虑,用户行为审计日志功能必不可少,通过本demo可以实现如下功能: 1.项目中记录审计日志的方法. 2.struts拦截器的基本配置和使用方法. 3.struts拦截器中 ...

  8. 多电脑切换器(KVM切换器)工作原理

    多电脑切换器(KVM切换器)工作原理 电子元器件知识,1月6日讯,电脑切换器又名KVM切换器,或者叫多电脑切换器,一般简称KVM,KVM为英语中键盘(Keyboard),显示器(Video)与鼠标(M ...

  9. 【转】视频分割器的工作原理及异常解决

    在有多个视频源组成的视频系统中,通常采用视频切换器使多路图像在一台显示设备上轮流显示.但有时为了让监控人员能同时看到所有监控点的情况,往往采用多视频分割器使得多路图像同时显示在一台显示设备上.当采用几 ...

  10. 解密超高频RFID读写器的工作原理

    RFID无线射频识别,是一种非接触式自动化识别技术.可以通过无线电讯号识别特定目标并读写相关数据,而无需识别系统与特定目标之间建立机械或者光学接触.识别过程无需人为干预,可工作在很多恶劣环境.可识别运 ...

最新文章

  1. 独家 | 使用Spark进行大规模图形挖掘(附链接)
  2. java的hashmap排序_Java面试题:如何对HashMap按键值排序
  3. javascript正则表达式介绍
  4. 贴一段数组动态扩容的代码
  5. 文件传输服务器多目录,node ftp 模块 如何把本地多个文件夹或者文件上传到服务器...
  6. (解题报告)L1-032 Left-pad (20分)——15行代码AC
  7. P1967,ssl2267-货车运输【树上倍增LCA,最小生成树变形kruskal】
  8. linux 高级IO函数之sendfile splice tee
  9. Amazon S3 各服務據點速度比較
  10. 【Hadoop】the short-cricuit local reads feature cannnot be use because UNIX Domain sockets are not ava
  11. Silverlight 2.5D RPG游戏技巧与特效处理:(十八)开场卷轴与动态窗口
  12. qnap威联通作文件服务器,QNAP 威联通 453BT3 网络存储服务器 使用手记,Nas中的小钢炮...
  13. matlab直方图拉伸、均衡化和匹配
  14. teamviewer 11 linux,安装Teamviewer的问题
  15. 基于新浪微博的男女性择偶观数据分析(下)
  16. 华为服务器基本功能介绍 及服务器BMC提供的基本功能
  17. 磁盘管理器显示状态良好 计算机不显示,win7系统打开磁盘管理显示显示状态良好(有危险)的解决方法...
  18. ps大图缩小让小图更清晰
  19. java设计扑克牌比大小_2019-08-09Day10 单例设计模式,扑克牌比大小游戏(Java)
  20. 如何在Google上下载高清原图

热门文章

  1. linux ahci 驱动下载,linux ahci驱动分析 SylixOS中AHCI驱动框架分析
  2. C语言自定义中文字符数组,C语言数组——字符数组
  3. 2020.10.20英语前端电话面试总结
  4. vue2.0 axios封装
  5. appium ios 下拉刷新输入框输入后收起键盘
  6. 4600u黑苹果 r5_黑苹果台式机机型选择指导
  7. 【免费】Discuz素材资源交易论坛整站源码/带数据整站源码打包
  8. 101—200之间的素数-Java编写
  9. 3dmax测试软件自动关闭,3dmax软件会自动关闭解决方案
  10. php程序员中文,php中文网“php程序员工具箱” v0.1版本上线