博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Struts2--拦截器(Interceptor)简介和实现原理
阅读量:2442 次
发布时间:2019-05-10

本文共 1381 字,大约阅读时间需要 4 分钟。

拦截器概述

拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之间,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。

在Webwork中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。

谈到拦截器,还有一个词——拦截器链(Interceptor Chain,在Struts2中称为拦截器栈Interceptor Stack)。拦截器链是将拦截器一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

在 Struts2 框架中,拦截器是其重要的组成部分,Struts2 的很多功能(数据校验、对象类型转换、文件上传等)都是构建在拦截器之上的。

通常情况下,开发者通过 Struts2 内建的拦截器可以完成大部分的操作,只有在内建拦截器不能满足需求时,才会自己扩展。可以这么说,Struts2 框架的简单易用,与拦截器的作用是分不开的。

拦截器(Interceptor)是 Struts2 框架的核心组成部分,它类似于 Servlet 中的过滤器,是一种可以在请求之前或之后执行的 Struts2 的组件,也可以将其理解为动态拦截 Action 调用的对象。

在早期的 MVC 框架中,通常会将一些通用的操作(如类型转换、数据校验、解析上传的文件等)强制写在控制器中,而这些常用操作又不是所有的请求都需要实现的,这就导致了框架的灵活性不足、可扩展性低等问题。

在 Struts2 框架中,这些通用的核心功能都放到了拦截器中实现,而不是集中放在核心控制器中实现。

由于框架中各个功能对应的拦截器是分开定义的,每个拦截器都可以完成单个功能,并且可以自由选择、灵活组合,而需要哪些拦截器时,只要在 struts.xml 配置文件中指定即可,所以 Struts2 框架的使用十分灵活。同时,由于在 Struts2 框架中支持自定义拦截器,所以其扩展性十分强大。

当多个拦截器组合在一起时就形成了拦截器链(Interceptor Chain)或拦截器栈(Interceptor Stack)。

拦截器链就是指对应各个功能的拦截器按照一定的顺序排列在一起形成的链,而拦截器链组成的集合就是拦截器栈。当有适配连接器栈的访问请求进来时,这些拦截器就会按照之前定义的顺序被调用。

实现原理

在通常情况下,拦截器都是以代理方式调用的,它在一个 Action 执行前后进行拦截,围绕着 Action 和 Result 的执行而执行,其工作方式如下图所示。

从上图中可以看出,Struts2 拦截器的实现原理与 Servlet 过滤器的实现原理类似,它以链式执行,对真正要执行的方法(execute())进行拦截。

在执行 Action 的 execute() 方法之前会执行一次拦截,在 Action 和 Result 执行之后,拦截器会再次执行(与先前的调用顺序相反)。在此链式执行的过程中,每一个拦截器都可以直接返回,从而终止余下的拦截器、Action 及 Result 的执行。

转载地址:http://xasqb.baihongyu.com/

你可能感兴趣的文章
SitePoint Podcast#173:释放混乱的猴子
查看>>
php 查询成绩_与专家讨论PHP: 成绩单
查看>>
一年新的一年_一年的云创新
查看>>
使用PHP从Access数据库中提取对象,第2部分
查看>>
openbiz_Openbiz Cubi:健壮PHP应用程序框架,第1部分
查看>>
使用PHP从Access数据库中提取对象,第1部分
查看>>
使用云waf的案例_9种流行的云使用案例
查看>>
类集合转换类集合_PHP中的集合类
查看>>
使用SimplePie消费Feed
查看>>
运算符二进制_基本转换和二进制运算符
查看>>
SitePoint播客#121:在线社区圆桌会议第2部分
查看>>
pchart_用pChart绘制图表
查看>>
Git简介,第1部分
查看>>
微信 获取地理位置名称_使用地理名称的目标地理位置
查看>>
graph api_与Facebook Graph API集成
查看>>
本地应用程序_本地化PHP应用程序的“正确方法”,第4部分
查看>>
mfc单文档绘制世界坐标系_文档使世界运转
查看>>
防止跨站请求伪造(CSRF)
查看>>
科创板 云计算业务公司_云计算对您的业务意味着什么
查看>>
SitePoint播客#80:与澳大利亚团队的FullCodePress
查看>>