AOP(Aspect-Oriented Programming,面向切面编程)是一种编程思想,并不是一种具体的实现,谈到实现一般有Filter和代理模式两种常见的使用方式,Spring中的AOP也是封装代理模式完成的,可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP利用封装、继承和多态把一切事物打造成对象结构,但是对于所有对象中都存在的一些公共行为,OOP就显得无能为力,也就是说OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。抽象和接口虽好,但对所有不相干的对象建立共同的接口或父类未免有些生硬,例如日志功能,日志代码几乎散布在所有的对象层次中,而它和散布到对象的核心功能毫无关系,对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。因此,为减少这种大量的重复代码,面向切面技术诞生了,AOP和OOP的关系好似JSP和Servlet的关系,以此之长,补彼之短。

Java中常见的AOP技术有两个,分别是Filter和代理模式(也可以称为过滤器和拦截器),Filter是基于回调函数(请看《Java回调机制解析》),代理模式是基于Java反射技术,代理模式又分为静态代理和动态代理,动态代理就是拦截器的简单实现。(过滤器和拦截器的区别可参见《过滤器和拦截器的区别》)他们各自实现的功能不同,原理如出一辙。如下图,以添加用户为例,采用Module1架构模式,从图中可以看出无论程序从左向右或者从右向左执行都必须经过Filter,Filter在Request到达JSP(Servlet)前截获Request并进行预处理,也可以在Response离开JSP(Servlet)时处理Response,然后对Request进行统一的设置后继续向后传递,比如可以在Filter完成字符集的设置,用户身份的识别,敏感词汇的过滤等等,配置Filter个数不限。

下面就以设置字符集为例,首先创建一个Class文件,并让他实现Filter接口,覆写init和doFilter,代码如下:

<span style="font-family:Arial;">package com.snail.drp.util.filter;import java.io.IOException;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;public class CharsetEncodingFilter implements Filter {private String endcoding;@Overridepublic void destroy() {// TODO Auto-generated method stub}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {request.setCharacterEncoding(endcoding);//继续执行chain.doFilter(request, response);   }@Overridepublic void init(FilterConfig filterConfig) throws ServletException {this.endcoding = filterConfig.getInitParameter("encoding");}
}</span>

Filter虽不是一个Servlet,但它需要在web.xml文件中配置之后才能使用,具体解释看代码中的注释,如下:

<span style="font-family:Arial;">   <filter>      <filter-name>CharsetEncodingFilter</filter-name><filter-class>com.snail.drp.util.filter.CharsetEncodingFilter</filter-class><!--在Filter初始化时,设置编码格式  --><init-param><param-name>encoding</param-name><param-value>GB18030</param-value></init-param></filter><!-- 设置Filter范围,指对Post请求起作用 --><filter-mapping><filter-name>CharsetEncodingFilter</filter-name><url-pattern>*.jsp</url-pattern></filter-mapping><filter-mapping><filter-name>CharsetEncodingFilter</filter-name><url-pattern>/servlet/*</url-pattern></filter-mapping></span>

Filter是职责链模式的经典应用,从上面示例代码可以看出,实现了Filter接口的doFilter方法主要用于截获Request对象,把截获的请求处理后(设置字符集),调用FilterChain 接口的chain.doFilter(request,response)方法,把处理权传递给下一个filter。

其中,FilterChain维护了一个链表,链表中存放着配置对象的链条,每次用户调用 一次chain.doFilter(request, response),链表就去取下一个配置对象,再通过配置对象 得到下一个filter,然后调用该filter,接着在filter里写的逻辑就被执行了。

AOP--Filter使用,过滤器和拦截器的区别相关推荐

  1. struts2 过滤器和拦截器的区别和使用

    struts2 过滤器和拦截器的区别和使用 java web 过滤器和拦截器的区别和使用  1.1 什么是拦截器:      拦截器,在AOP(Aspect-Oriented Programming) ...

  2. Springboot过滤器和拦截器的区别

    上两篇文章我们介绍了过滤器Filter和拦截器Intercepter,其功能都是对请求进行拦截并对请求过滤,本篇文章就介绍一下两者的区别 1. 过滤器和拦截器的区别 过滤器和拦截器触发时机不一样,过滤 ...

  3. Spring过滤器和拦截器的区别

    Spring过滤器和拦截器的区别 两者的作用 过滤器: 是在javaweb中,你传入的request.response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts ...

  4. Java 过滤器与拦截器的区别

    什么是过滤器(Filter) 过滤器,是在java web中将你传入的request.response提前过滤掉一些信息,或者提前设置一些参数.然后再传入Servlet或Struts2的 action ...

  5. 过滤器跟拦截器的区别

    一.拦截器与过滤器的区别总结 1. 原理不同:拦截器是基于java的反射机制的,而过滤器是基于函数回调. 2. 依赖容器:拦截器不依赖与servlet容器,过滤器依赖与servlet容器. 3. 作用 ...

  6. 过滤器和拦截器的区别和执行顺序

    一.两者的区别 1.拦截器 java里的拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同 ...

  7. java web 过滤器跟拦截器的区别和使用

    2019独角兽企业重金招聘Python工程师标准>>> 1.首先要明确什么是拦截器.什么是过滤器 1.1 什么是拦截器: 拦截器,在AOP(Aspect-Oriented Progr ...

  8. SpringMVC中过滤器和拦截器的区别

    文章目录 1.引言 2.共同点 3.区别 3.1.拦截器 3.2.过滤器 4.具体实现 4.1.拦截器 4.1.1.拦截实现方式 4.1.2.拦截实现 4.2.过滤器 4.2.1.过滤器实现方式 4. ...

  9. struts过滤器和拦截器的区别

    拦截器的工作原理:当接收到一个httprequest ,a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标准的过滤器链 c) FilterDisp ...

最新文章

  1. hive提交命令org.apache.hadoop.yarn.exceptions.YarnRuntimeException: Error parsing application ID:
  2. 洛谷P4559 [JSOI2018]列队 【70分二分 + 主席树】
  3. 时间序列趋势判断(一)——斜率阈值判断
  4. java集成agent作用_javaagent 基于 javaagent 开发的 APM 工具,收集方法的执行次数和执行时间,定时输出成 json 格式 @codeKK Android开源站...
  5. android 阻止来电号码,4种方法来在安卓手机上阻止来电
  6. maven仓库--私服(Nexus的配置使用)
  7. 关于AD15中恢复默认菜单的快捷操作
  8. latex如何设置字体并加粗_latex怎么把字加粗
  9. 关于st-link与stm32f103c8t6连接
  10. mysql复杂查询的书_mysql 复杂查询
  11. 什么是人群标签,旺旺号标签如何查询,淘宝号搜索标签查询,淘宝号的千人千面,买家行为标签透视,旺旺号标签API接口
  12. 第四期单独赠书,书籍翻倍,给你留了一本。
  13. CCNP课堂练习一:详解交换机vlan的介绍及通过交换机从逻辑上划分区域配置
  14. 阿里云ACP云计算错题集41-70
  15. Windows7 IIS7.5部署ASP网站
  16. 【CSS】CSS列表【CSS基础知识详解】
  17. java棋盘覆盖_棋盘覆盖问题实现
  18. Quartus II 功能仿真设置流程
  19. 百家号自媒体平台的信用分修炼指南
  20. 滴滴外卖开到美团打车大本营南京,王兴怎么想?

热门文章

  1. 关于cocos creator 2.0的废除cc.p接口Sorry, cc.p is deprecated. Please use cc.v2 instead
  2. 人脸检测--TinaFace
  3. GPS跟踪载波环matlab代码,GPS接收机载波跟踪环路解决方案
  4. 实现HTTP2.0方式
  5. 常见的HTTP网络状态码汇总+HttpServletResponse源码
  6. PostgreSQL向量计算插件——vops
  7. 分治策略时间复杂度计算
  8. 2021-06-10 multisim仿真,高温报警电路555
  9. CardView的详细使用
  10. 小白爬虫入门——装软件