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层含义:
    1. ActionInvocation是ActionProxy实例化的,封装了关于action以及相关Interceptor的信息。
    2. 如果拦截器堆栈中还有其他的Interceptor,那么invocation.invoke()将调用堆栈中下一个Interceptor的执行。
    3. 如果拦截器堆栈中只有Action了,那么invocation.invoke()将调用Action执行。

    所以,我们可以发现,invocation.invoke()这个方法其实是整个拦截器框架的实现核心。基于这样的实现机制,我们还可以得到下面2个非常重要的推论:

    1. 如果在拦截器中,我们不使用invocation.invoke()来完成堆栈中下一个元素的调用,而是直接返回一个字符串作为执行结果,那么整个执行将被中止。
    2. 我们可以以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相关推荐

  1. java servlet filter_Java的Servlet、Filter、Interceptor、Listener

    写在前面: 使用Spring-Boot时,嵌入式Servlet容器可以通过扫描注解(@ServletComponentScan)的方式注册Servlet.Filter和Servlet规范的所有监听器( ...

  2. spring 两次进入拦截器_4.SpringBoot 拦截器Fliter,Interceptor,Controller……

    在项目的开发中,在某些情况下,我们需要对客户端发出的请求进行拦截,常用的API拦截方式有Fliter,Interceptor,ControllerAdvice以及Aspect. 上面的图是Spring ...

  3. strust2自定义interceptor的基本方法及操作

    需求:制作一个网站需要用户登陆后才能查看,即一个权限的问题 1.首先明确在用户没登陆前有两个Action请求是可以通过的,即注册和登陆. 2.创建拦截器,如UserLoginInterceptor.j ...

  4. Hadoop生态圈-Flume的组件之自定义拦截器(interceptor)

    Hadoop生态圈-Flume的组件之自定义拦截器(interceptor) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客只是举例了一个自定义拦截器的方法,测试字节传输速 ...

  5. Unity的三种Interceptor

    Unity默认提供了三种拦截器:TransparentProxyInterceptor.InterfaceInterceptor.VirtualMethodInterceptor. Transpare ...

  6. java url 拦截_Spring mvc设置某些url不被interceptor拦截器拦截的方法

    我们的Java类继承HandlerInterceptorAdapter类之后,实现里面的preHandle与postHandle方法,默认情况下所有的url都会被spring mvc拦截器所拦截,因为 ...

  7. SpringBoot mybatis Interceptor分页实现

    环境准备 什么是拦截器 为什么要这样写 具体实现 什么是拦截器 SpringBoot mybatis interceptor拦截器是你在执行SQL语句之前对执行的SQL语句进行修改 分页的原理是通过拦 ...

  8. springboot filter and interceptor实战之mdc日志打印

    1.1  mdc日志打印全局控制 1.1.1    logback配置 <property name="log.pattern" value="%d{yyyy-MM ...

  9. 三、CXF对Interceptor拦截器的支持

    前面在Axis中介绍过Axis的Handler,这里CXF的Interceptor就和Handler的功能类似.在每个请求响应之前或响应之后,做一些事情.这里的Interceptor就和Filter. ...

最新文章

  1. mysql所有班级名称和人数_mysql数据库优化课程---12、mysql嵌套和链接查询(查询user表中存在的所有班级的信息?)...
  2. 《 嵌入式系统设计与实践》一一3.6 测试硬件(和软件)
  3. struts2漏洞监测_Apache Shiro身份验证绕过漏洞风险提示
  4. POJ 3237.Tree -树链剖分(边权)(边值更新、路径边权最值、区间标记)贴个板子备忘...
  5. 20171101从现在开始就请有计划的学习吧!
  6. Linux下常用的压缩与解压命令
  7. java 写tb级文件_三管齐下!TB 级文件的上传性能瞬间被优化 100 倍!
  8. python 字符串replace函数_01-Python里字符串的常用操作方法--replace()函数
  9. python数字运算程序_python03 一些简单的数字运算
  10. zk 02之 Windows安装和使用zookeeper
  11. boid模型的Matlab程序,基于Boid模型以及吸引—排斥模型的沙丁鱼集群运动行为模拟...
  12. HBase与Zookeeper数据结构查询
  13. 利用Mapinfo工具转地图数据
  14. 满满干货!邮储银行java面试
  15. python小游戏编程arcade----坦克动画图片合成
  16. 订阅新闻联播文字标题到邮箱
  17. 银行卡号简单的格式化显示处理(支付宝、微信绑定卡列表显示卡号)
  18. 半导体功率器件静态参数测试仪系统 能测 IGBT. Mosfet. Diode. BJT......
  19. PAT乙级1025题解
  20. R语言怎么比较两个模型C指数,手把手教你用R语言评价临床预测模型,一文就够(附代码)...

热门文章

  1. 找规律 百度之星资格赛 1001 大搬家
  2. C#分布式事务(TransactionScope )
  3. PHP和MySQL入门(3)
  4. 高手教你如何用香技巧香水达人教你用香省钱法 - 生活至上,美容至尚!
  5. 10.22 tcpdump:监听网络流量
  6. LNMP平台对接redis服务
  7. mysql只能查询出1000条数据_MySQL SELECT语句中只能输出1000行数据的原因
  8. input自适应_深度残差网络+自适应参数化ReLU(调参记录18)Cifar10~94.28%
  9. wxpython使用matplot_测试怎么将MatPlotLib嵌入到wxPython中
  10. 新内容、新交互、新增长:视频云为短视频及电商直播行业高效赋能