深入解析Struts拦截器的工作原理
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拦截器的工作原理相关推荐
- Google Chrome 新广告拦截器的工作原理
转自: https://www.ctrl.blog/entry/chrome-adblocker google chrome 将在2018年2月15日开始对某些网站上的广告进行屏蔽. 笔者看了一下Ch ...
- Struts2→拦截器、工作原理、拦截器计算Action执行时间、Struts2自带拦截器、拦截器栈
工作原理 实现拦截器 样例 Struts2自带拦截器 拦截器栈(先进后出) TOKEN防表单重复提交 文字拦截器 AJAX
- struts2拦截器的实现原理及源码剖析
拦截器(interceptor)是Struts2最强大的特性之一,也可以说是struts2的核心,拦截器可以让你在Action和result被执行之前或之后进行一些处理.同时,拦截器也可以让你将通用的 ...
- 利用Struts拦截器限制上传图片的格式和大小
在这之前 Struts的一个核心功能就是大量的拦截器,既然是框架,那么自然也就贴心地为我们准备好了各种常用的功能,比如这里即将讨论的如何限制上传图片的格式和大小.那么既然是使用Struts已经写好的拦 ...
- ABP 拦截器不工作
想写个拦截器,但是按照官方教程,发现自定义的拦截器不工作. 经过排查发现是需要顶要你要被拦截的方法为虚方法才能功能. 先贴两个链接. 后面再找解决办法 为什么我的拦截器不工作 为什么拦截器在non-v ...
- Struts 拦截器权限控制【通过拦截器实现登录后跳转到登录前页面】
应用情形:在web项目中,经常会遇到用户未登录或SESSION失效时用户发出非法的权限操作,如新闻的评论.文件的下载等等,在此我们可以使用struts拦截器对该用户发出的请求进行拦截,拦截后判断用户是 ...
- struts拦截器+注解实现网络安全要求中的日志审计功能
J2EE项目中出于安全的角度考虑,用户行为审计日志功能必不可少,通过本demo可以实现如下功能: 1.项目中记录审计日志的方法. 2.struts拦截器的基本配置和使用方法. 3.struts拦截器中 ...
- 多电脑切换器(KVM切换器)工作原理
多电脑切换器(KVM切换器)工作原理 电子元器件知识,1月6日讯,电脑切换器又名KVM切换器,或者叫多电脑切换器,一般简称KVM,KVM为英语中键盘(Keyboard),显示器(Video)与鼠标(M ...
- 【转】视频分割器的工作原理及异常解决
在有多个视频源组成的视频系统中,通常采用视频切换器使多路图像在一台显示设备上轮流显示.但有时为了让监控人员能同时看到所有监控点的情况,往往采用多视频分割器使得多路图像同时显示在一台显示设备上.当采用几 ...
- 解密超高频RFID读写器的工作原理
RFID无线射频识别,是一种非接触式自动化识别技术.可以通过无线电讯号识别特定目标并读写相关数据,而无需识别系统与特定目标之间建立机械或者光学接触.识别过程无需人为干预,可工作在很多恶劣环境.可识别运 ...
最新文章
- 独家 | 使用Spark进行大规模图形挖掘(附链接)
- java的hashmap排序_Java面试题:如何对HashMap按键值排序
- javascript正则表达式介绍
- 贴一段数组动态扩容的代码
- 文件传输服务器多目录,node ftp 模块 如何把本地多个文件夹或者文件上传到服务器...
- (解题报告)L1-032 Left-pad (20分)——15行代码AC
- P1967,ssl2267-货车运输【树上倍增LCA,最小生成树变形kruskal】
- linux 高级IO函数之sendfile splice tee
- Amazon S3 各服務據點速度比較
- 【Hadoop】the short-cricuit local reads feature cannnot be use because UNIX Domain sockets are not ava
- Silverlight 2.5D RPG游戏技巧与特效处理:(十八)开场卷轴与动态窗口
- qnap威联通作文件服务器,QNAP 威联通 453BT3 网络存储服务器 使用手记,Nas中的小钢炮...
- matlab直方图拉伸、均衡化和匹配
- teamviewer 11 linux,安装Teamviewer的问题
- 基于新浪微博的男女性择偶观数据分析(下)
- 华为服务器基本功能介绍 及服务器BMC提供的基本功能
- 磁盘管理器显示状态良好 计算机不显示,win7系统打开磁盘管理显示显示状态良好(有危险)的解决方法...
- ps大图缩小让小图更清晰
- java设计扑克牌比大小_2019-08-09Day10 单例设计模式,扑克牌比大小游戏(Java)
- 如何在Google上下载高清原图
热门文章
- linux ahci 驱动下载,linux ahci驱动分析 SylixOS中AHCI驱动框架分析
- C语言自定义中文字符数组,C语言数组——字符数组
- 2020.10.20英语前端电话面试总结
- vue2.0 axios封装
- appium ios 下拉刷新输入框输入后收起键盘
- 4600u黑苹果 r5_黑苹果台式机机型选择指导
- 【免费】Discuz素材资源交易论坛整站源码/带数据整站源码打包
- 101—200之间的素数-Java编写
- 3dmax测试软件自动关闭,3dmax软件会自动关闭解决方案
- php程序员中文,php中文网“php程序员工具箱” v0.1版本上线