StrutsPreparedAndExcuteFilter与Interceptor
filter详解
Filter种类(servlet预处理)
- 用户授权的Filter:Filter负责检查用户请求,对用户访问权限的控制
- 日志Filter:详细记录某些特殊的用户请求。
- 负责解码的Filter:包括对非标准编码的请求解码。
- Filter可负责拦截多个请求或响应;一个请求或响应也可被多个请求拦截
filter的常用方法与生命周期
void destory()
void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)
void init(FilterConfig filterConfig)
所有的filters会形成一个FilerChain,web服务器根据filter在web.xml中的注册顺序,依次执行dofilter方法(该方法会传入FilterChain对象),每个filter的dofilter方法都会有chain.dofilter( , )这行代码,产生的效果为:如果这不是最后一个filter,那么就向下继续执行下一个filter的dofilter方法,否则将请求发送到servlet中进行响应。httpservletResponse依次经过filter相反的顺序返回给浏览器。
filter在web.xml中的配置(以struts为例)
注:filter只会拦截符合url-pattern的请求模式属于dispatcher标签的请求。
<filter><filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class><filter-mapping><filter-name>struts</filter-name><!-- 所有的url都会被url过滤器解析 --><url-pattern>/*</url-pattern> <!--forward表示只过滤内部转发的请求--><dispatcher>FORWARD</dispatcher> <!--request表示只过滤客户端的请求--><dispatcher>REQUEST</dispatcher></filter-mapping>
filter与servlet关系
filter可以认为是Servlet的一种“加强版”,它主要用于对HttpServletRequest进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链(filterChain)。但它不能对请求做出响应,这是与servlet的最大区别。
StrutsPreparedAndExcutedFilter
在该filer的init()方法中,会加载struts.properties文件和struts.xml等文件,在dofilter方法中,会创建一个ActionContext对象(该对象可以与servlet api进行交互),并根据请求的action映射到实际资源,在struts中该filter和action充当控制器的作用。
Interceptor(对比filter理解)
- void init():在该拦截器被实例化之后,在该拦截器执行拦截之前,系统将回调该方法。对于每个拦截器而言,其init()方法只执行一次。因此,该方法的方法体主要用于初始化资源。
- void destory():该方法与init()方法对应。在拦截器实例被销毁之前,系统将回调该拦截器的destory方法,该方法用于销毁在init方法里打开的资源。
- String intercept(ActionInvocation invocation):这个方法具备以下2层含义:
- ActionInvocation是ActionProxy实例化的,封装了关于action以及相关Interceptor的信息。
- 如果拦截器堆栈中还有其他的Interceptor,那么invocation.invoke()将调用堆栈中下一个Interceptor的执行。
- 如果拦截器堆栈中只有Action了,那么invocation.invoke()将调用Action执行。
所以,我们可以发现,invocation.invoke()这个方法其实是整个拦截器框架的实现核心。基于这样的实现机制,我们还可以得到下面2个非常重要的推论:
- 如果在拦截器中,我们不使用invocation.invoke()来完成堆栈中下一个元素的调用,而是直接返回一个字符串作为执行结果,那么整个执行将被中止。
- 我们可以以invocation.invoke()为界,将拦截器中的代码分成2个部分,在invocation.invoke()之前的代码,将会在Action之前被依次执行,而在invocation.invoke()之后的代码,将会在Action之后被逆序执行。
由此,我们就可以通过invocation.invoke()作为Action代码真正的拦截点,从而实现AOP(切面编程)。
Interceptor和Filter区别与联系
1.filter通过chain.dofilter()进行函数回调,而Interceptor是基于java反射的
2.filter存在于servlet容器中,Intercept不然独立web容器
3.filter作用于servlet,即几乎对所有请求都有过滤作用,而intercepor只对action请求起作用
4.在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
5.都是aop思想的实现
转载于:https://www.cnblogs.com/kundeg/p/6534900.html
StrutsPreparedAndExcuteFilter与Interceptor相关推荐
- java servlet filter_Java的Servlet、Filter、Interceptor、Listener
写在前面: 使用Spring-Boot时,嵌入式Servlet容器可以通过扫描注解(@ServletComponentScan)的方式注册Servlet.Filter和Servlet规范的所有监听器( ...
- spring 两次进入拦截器_4.SpringBoot 拦截器Fliter,Interceptor,Controller……
在项目的开发中,在某些情况下,我们需要对客户端发出的请求进行拦截,常用的API拦截方式有Fliter,Interceptor,ControllerAdvice以及Aspect. 上面的图是Spring ...
- strust2自定义interceptor的基本方法及操作
需求:制作一个网站需要用户登陆后才能查看,即一个权限的问题 1.首先明确在用户没登陆前有两个Action请求是可以通过的,即注册和登陆. 2.创建拦截器,如UserLoginInterceptor.j ...
- Hadoop生态圈-Flume的组件之自定义拦截器(interceptor)
Hadoop生态圈-Flume的组件之自定义拦截器(interceptor) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客只是举例了一个自定义拦截器的方法,测试字节传输速 ...
- Unity的三种Interceptor
Unity默认提供了三种拦截器:TransparentProxyInterceptor.InterfaceInterceptor.VirtualMethodInterceptor. Transpare ...
- java url 拦截_Spring mvc设置某些url不被interceptor拦截器拦截的方法
我们的Java类继承HandlerInterceptorAdapter类之后,实现里面的preHandle与postHandle方法,默认情况下所有的url都会被spring mvc拦截器所拦截,因为 ...
- SpringBoot mybatis Interceptor分页实现
环境准备 什么是拦截器 为什么要这样写 具体实现 什么是拦截器 SpringBoot mybatis interceptor拦截器是你在执行SQL语句之前对执行的SQL语句进行修改 分页的原理是通过拦 ...
- springboot filter and interceptor实战之mdc日志打印
1.1 mdc日志打印全局控制 1.1.1 logback配置 <property name="log.pattern" value="%d{yyyy-MM ...
- 三、CXF对Interceptor拦截器的支持
前面在Axis中介绍过Axis的Handler,这里CXF的Interceptor就和Handler的功能类似.在每个请求响应之前或响应之后,做一些事情.这里的Interceptor就和Filter. ...
最新文章
- mysql所有班级名称和人数_mysql数据库优化课程---12、mysql嵌套和链接查询(查询user表中存在的所有班级的信息?)...
- 《 嵌入式系统设计与实践》一一3.6 测试硬件(和软件)
- struts2漏洞监测_Apache Shiro身份验证绕过漏洞风险提示
- POJ 3237.Tree -树链剖分(边权)(边值更新、路径边权最值、区间标记)贴个板子备忘...
- 20171101从现在开始就请有计划的学习吧!
- Linux下常用的压缩与解压命令
- java 写tb级文件_三管齐下!TB 级文件的上传性能瞬间被优化 100 倍!
- python 字符串replace函数_01-Python里字符串的常用操作方法--replace()函数
- python数字运算程序_python03 一些简单的数字运算
- zk 02之 Windows安装和使用zookeeper
- boid模型的Matlab程序,基于Boid模型以及吸引—排斥模型的沙丁鱼集群运动行为模拟...
- HBase与Zookeeper数据结构查询
- 利用Mapinfo工具转地图数据
- 满满干货!邮储银行java面试
- python小游戏编程arcade----坦克动画图片合成
- 订阅新闻联播文字标题到邮箱
- 银行卡号简单的格式化显示处理(支付宝、微信绑定卡列表显示卡号)
- 半导体功率器件静态参数测试仪系统 能测 IGBT. Mosfet. Diode. BJT......
- PAT乙级1025题解
- R语言怎么比较两个模型C指数,手把手教你用R语言评价临床预测模型,一文就够(附代码)...
热门文章
- 找规律 百度之星资格赛 1001 大搬家
- C#分布式事务(TransactionScope )
- PHP和MySQL入门(3)
- 高手教你如何用香技巧香水达人教你用香省钱法 - 生活至上,美容至尚!
- 10.22 tcpdump:监听网络流量
- LNMP平台对接redis服务
- mysql只能查询出1000条数据_MySQL SELECT语句中只能输出1000行数据的原因
- input自适应_深度残差网络+自适应参数化ReLU(调参记录18)Cifar10~94.28%
- wxpython使用matplot_测试怎么将MatPlotLib嵌入到wxPython中
- 新内容、新交互、新增长:视频云为短视频及电商直播行业高效赋能