http://blog.csdn.net/yerenyuan_pku/article/details/68648101

Struts2的拦截器

拦截器的概述

拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。 
在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个Action执行的前后执行的代码,也可以在一个Action执行前阻止其执行。同时也是提供了一种可以提取Action中可重用的部分的方式。 
谈到拦截器,还有一个词大家应该知道——拦截器链(Interceptor Chain,在Struts2中称为拦截器栈,Interceptor Stack)。拦截器链就是将拦截器按一定的顺序连接成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。 
下面是我对于拦截器概念的理解。 
我们知道在Struts2框架里面有很多的拦截器,在拦截器里面帮我们实现了一部分功能。但在Strtus2框架里面的很多的拦截器,并不是都执行,每次只会执行一些默认的拦截器,那这些拦截器是在哪儿呢?Strtus2框架里面默认拦截器位置的是在struts2-core-2.3.24.jar包下的struts-default.xml文件中,在该文件中,我们可找到默认拦截器的配置:

<interceptor-stack name="defaultStack"><interceptor-ref name="exception"/> <interceptor-ref name="alias"/> <interceptor-ref name="servletConfig"/> <interceptor-ref name="i18n"/> <interceptor-ref name="prepare"/> <interceptor-ref name="chain"/> <interceptor-ref name="scopedModelDriven"/> <interceptor-ref name="modelDriven"/> <interceptor-ref name="fileUpload"/> <interceptor-ref name="checkbox"/> <interceptor-ref name="datetime"/> <interceptor-ref name="multiselect"/> <interceptor-ref name="staticParams"/> <interceptor-ref name="actionMappingParams"/> <interceptor-ref name="params"/> <interceptor-ref name="conversionError"/> <interceptor-ref name="validation"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> <interceptor-ref name="workflow"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> <interceptor-ref name="debugging"/> <interceptor-ref name="deprecation"/> </interceptor-stack>

问题来了,拦截器是在什么时候执行的呢?在Action对象创建之后,在Action里面的方法执行之前执行拦截器。

拦截器的实现原理

大部分时候,拦截器方法都是通过代理的方式来调用的。Struts2的拦截器实现相对简单。当请求到达Struts2的ServletDispatcher时,Struts2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器。 
Struts2的拦截器是可插拔的,拦截器是AOP的一种实现。Struts2拦截器栈就是将拦截器按一定的顺序连接成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。 
关于对拦截器的底层实现原理,我的理解是——拦截器的底层实现原理主要有两部分:

  1. AOP思想:面向切面(方面)编程 
    在实际开发中,比如说有一个基本的功能,但我们想扩展其基本的功能,使用AOP思想,就能不修改源代码扩展功能,比如登录功能,参考下图: 
  2. 责任链模式(设计模式中的一种):类似于过滤链 
    过滤链:一个请求,可以有多个过滤器进行过滤,每个过滤器只有做放行操作,才能到下一个过滤器。 
    责任链模式:有一组操作,有增加、修改、删除操作。执行这三个操作,首先执行增加操作,增加执行之后做类似于放行的操作,放行之后执行修改操作,修改执行之后,做类似于放行的操作,放行之后执行删除操作。

拦截器的执行流程

拦截器的执行流程可参考官网提供的图,如下: 

看上面的图,还是比较空洞,所以我还是做一点点解释。要理解拦截器的执行流程,须理解下面这3点:

  1. 拦截器在action对象创建之后,action里面的方法执行之前执行。
  2. 在Struts2框架里面执行默认的拦截器,在action中不需要调用拦截器的方法,使用配置方式执行,这就是AOP思想的体现。
  3. 执行很多的拦截器,比如有3个拦截器,首先执行拦截器1,然后做类似放行的操作,执行拦截器2,之后做类似放行的操作,执行拦截器3,做类似放行的操作之后,之后action里面的方法。

拦截器和过滤器的区别

过滤器理论上可以过滤任意内容,如过滤jsp、过滤html、过滤图片(路径)、过滤servlet等。而拦截器是可以拦截内容,但拦截器只能拦截action。

转载于:https://www.cnblogs.com/telwanggs/p/6970614.html

(转)Struts2的拦截器相关推荐

  1. struts2自定义拦截器并配置拦截器使其生效

    首先编写一个struts2的拦截器,要继承 MethodFilterInterceptor 并获取其中的方法 package star.july.d_interceptor;import com.op ...

  2. Struts2之拦截器篇

    拦截器是Struts2框架的核心和基础,Struts2绝大多数功能都是通过拦截器来完成的,当StrutsPrepareAndExecuteFilter拦截到用户请求后,大量拦截器会对该请求进行处理,然 ...

  3. Struts2【拦截器】就是这么简单

    2019独角兽企业重金招聘Python工程师标准>>> 什么是拦截器 拦截器Interceptor.....拦截器是Struts的概念,它与过滤器是类似的...可以近似于看作是过滤器 ...

  4. struts2 18拦截器详解(五)

    I18nInterceptor 该拦截器处理defaultStack第四的位置,是用来方便国际化的,如果说我们的一个Web项目要支持国际化的话,通常的做法是给定一个下拉框列出所支持的语言,当用户选择了 ...

  5. Struts2自定义拦截器实例—登陆权限验证

    版本:struts2.1.6 此实例实现功能:用户需要指定用户名登陆,登陆成功进入相应页面执行操作,否则返回到登陆页面进行登陆,当直接访问操作页面(登陆后才能访问的页面)时则不允许,须返回登陆页面. ...

  6. dwz ajax session超时跳转登录页(struts2自定义拦截器)

    1.定义struts2拦截器(网上例子很多) 代码如下: package rt.intercepter;import java.util.Map;import javax.servlet.http.H ...

  7. Struts2 自定义拦截器(方法拦截器)

    转自:http://05061107cm.iteye.com/blog/365504 struts2系统自带了很多拦截器,有时需要我们自己定义,一般有两种方式: 一.实现Interceptor接口 J ...

  8. struts2中拦截器的使用

    拦截器的使用 实现AOP 转自http://www.cnblogs.com/fmricky/archive/2010/05/24/1742514.html 1.什么是拦截器(Interceptor) ...

  9. Struts2 自定义拦截器(easy example)

    要自定义拦截器需要实现com.opensymphony.xwork2.interceptor.Interceptor接口: 新建一个MyIntercept package com.action;imp ...

最新文章

  1. python3 异步 asyncio 动态添加任务
  2. 通过 IDE/Maven 部署 Serverless 应用实践
  3. <学习日记>计算机网络第一章预习记录
  4. 说两句电视剧《东归英雄》
  5. python没有联网_无网环境下的 Python 开发指南
  6. 强悍的命令行 —— less(与 more、cat 的区别)
  7. 计算机网络未来的发展和趋势论文,计算机网络发展论文范文
  8. ubuntu下取代ping的好工具tcpping
  9. minecraftjava版光追_我的世界:网易版终于更新狐狸生物?Java版光追技术已开始测试...
  10. 惠普linux打印驱动怎么安装驱动程序,hp打印机驱动怎么安装 惠普打印机驱动程序安装方法【详解】...
  11. 有哪些常用的虚拟主机管理系统
  12. java 获取field类型_获取Java类中所有Field
  13. 阿里文娱智能营销增益模型 ( Uplift Model ) 技术实践
  14. 普适计算Topic推荐-AMiner
  15. 《Loy解说Hystrix》
  16. Google是如何教会机器玩Atari游戏的
  17. python爬取猫眼遇到动态字体反爬
  18. 女孩,既要懂得暧昧,又要懂得拒绝 【20cn 依依】
  19. python画饼图柱状图_荐【python数据分析(24)】Matplotlib库基本图形绘制(1)(线形图、柱状图、堆叠图、面积图、填图、饼图)...
  20. 服务式办公室,价格影响选择

热门文章

  1. MySQL的两个存储引擎--MyISAM和InnoDB
  2. (4)FPGA JTAG接口连接(学无止境)
  3. (58)FPGA面试题-只使用双输入NAND门,设计了一个四输入NAND门
  4. (57)FPGA面试题-我们是否应该在敏感列表中包含组合电路的所有输入?
  5. (03)VHDL实现D触发器
  6. rtosucos和linux区别,为什么我们需要uCos?带你透彻理解RTOS
  7. 14. GD32F103C8T6入门教程-Systick定时器
  8. STM32F103_SPI读写外部FLASH
  9. 湖南高校教师评职称计算机等级考试,湖南高校教师职称评审出台新规,这些要点你了解了吗?...
  10. AHB-lite时序详细解读