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. SpringMVC通过注解方式读取properties文件中的值
  2. 【图像分割模型】BRNN下的RGB-D分割—LSTM-CF
  3. cometd_CometD:Java Web应用程序的Facebook类似聊天
  4. BugkuCTF-Crypto题散乱的密文
  5. 实现文件中名词的统计计数_通过勤哲EXCEL和Excel中的rank函数实现排名统计
  6. flutter网络请求dio的get、post、上传文件、下载文件总结
  7. DOM之节点操作总结(附实例、图解)
  8. Modelsim下载 安装 与 和谐教程
  9. html input属性都有啥,input 属性有哪些input标签常用属性
  10. SSM框架整合(参考尚硅谷视频和文档
  11. ffplay 分析概述
  12. 微信营销与微博营销的区别
  13. Java伪随机数生成器(PRNG)中的弱点
  14. CLIP CLAP
  15. 技术管理条线度量报告
  16. Hadoop经典案例——单词统计
  17. 扩散模型探索:DDIM 笔记与思考
  18. 二、rally使用指导
  19. 东莞惠州楼盘又来深抢客 推盘量居历史高位 2012.5.12
  20. 乐视网CEO梁军:现在就是缺钱 正在重新学习做生意 2017年09月20日01:18 新京报 37 微博 微信 QQ空间 添加喜爱 乐视网CEO梁军。 新京报记者 吴江 摄乐视网CEO梁军。 新京

热门文章

  1. TUIO+激光投影互动制作解析
  2. 第二届广东省大学生网络攻防大赛 simple_re
  3. 使用ETest实现汽车ECU的HIL测试
  4. MS17-010 永恒之蓝漏洞利用方式
  5. ocx注册成功但是页面不显示
  6. 在线旅游发展趋势分析
  7. 如何从CPU顶盖获取有用信息
  8. cx oracle 中文 u,cx_Oracle 中文乱码
  9. Android APK反编译教程(带工具)
  10. 分析对象竞是我自己?我在 9 月上班划水 1510 分钟!