当前位置:首页 期刊杂志

基于AOP思想的过滤器技术及其应用

时间:2024-05-04

黄玲



基于AOP思想的过滤器技术及其应用

黄玲

重庆工程学院,重庆 400056

AOP为Aspect Oriented Programming的缩写,意为面向切面编程。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。过滤器就应用了这种思想在客户端提交数据进行业务逻辑出来之前对提交的数据进行预处理。过滤器在生成系统日志,权限管理等方面有非常广泛的应用。

AOP;面向切面编程;拦截器

过滤器提供过滤作用,所谓过滤也就是说按照一定的规则放走一部分东西,而留下另一部分东西。形象地说,就像渔网。渔网有洞,比网洞大的鱼被渔网留在网里,而比网洞小的鱼则漏出渔网,从而起到了拦住大鱼,放掉小鱼的目的。

Java中的过滤器不能处理用户请求,和对客户端生成响应,它只提供过滤作用。主要用于对HttpServletRequest进行预处理,拦截Request之后,提取用户提交的数据;也可以对HttpServletResponse进行后处理,是个典型的处理链。一个web.xml文件中可以配置多过滤器,Web服务器按照它们在web.xml文件中的配置顺序来加载这些过滤器。

Servlet过滤器中结合了许多元素,从而使得过滤器成为独特、强大和模块化的Web组件。也就是说,Servlet过滤器是:

声明式的:通过Web部署中的XML标签来声明。这样允许添加和删除过滤器,而无需改动任何应用程序代码。

动态的:过滤器在运行时由Servlet容器调用来拦截和处理请求和响应。

灵活的:它可用于对来自客户机的直接调用执行预处理、后期处理以及处理在防火墙之后的Web组件之间调度的请求。最后,可以将过滤器链接起来以提供必需的功能。

模块化的:通过把应用程序处理逻辑封装到单个类文件中,过滤器从而定义了可容易地从请求或响应链中添加或删除的模块化单元[1]。

可移植的:与Java平台的其他许多方面一样,Servlet过滤器是跨平台和跨容器可移植的,从而进一步支持了Servler过滤器的模块化和可重用本质。

可重用的:归功于过滤器实现类的模块化设计,以及声明式的过滤器配置方式,过滤器可以容易地跨越不同的项目和应用程序使用。

透明的:过滤器可以根据需要添加或删除,而不会破坏Servlet或JSP页面。

Servlet可以用来处理用户请求。但是在用户具体的请求的业务功能的同时,系统有一些特殊的需求。比如确认该用户是否有权限提交该请求,这就是权限管理。对于有的系统,所有的用户请求都必须验证用户是否有权限。这种验证往往是共通,如果在每次请求中进行处理,不仅会产生大量的重复代码,工作量大,效率低,而且质量也无法保证。这时我们就可以用到过滤器了。过滤器拦截用户请求,判断用户是否有权限来访问这个资源。有则让他去访问,没有就让他转到另外一个页面。这样通过过滤器就实现了授权管理。当然过滤器不仅可以完成用户验证与权限管理,还有其他许多的用途。比如:验证用户提交的请求中有没有不合法的文字、字符;统计Web应用的访问量和访问的命中率,报告;实现Web应用的日志处理功能;实现数据压缩功能;对传输的数据进行加密;实现XML文件的XSLT转换等等。

一个用户请求,即一个Servlet可以有多个过滤器,以实现多个过滤逻辑[2]。

所有的Servlet过滤器都必须实现javax.servlet. Filter接口,并实现该接口中的三个方法:init(Filter Config filter Config)。

Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用该方法。该方法将读取web.xml文件中Servlet过滤器的初始化参数。doFilter(ServletRequest request,ServletResponse response,FilterChain chain).

该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法,FilterChain用户访问后续过滤器。

destroy()

在Web容器卸载过滤器前被调用。该方法在Filter的生命周期中仅执行一次,可以释放过滤器使用的资源。

图1 过滤的执行流程

过滤器的执行流程如图所示,过滤器的处理过程是一个链式的过程(FilterChain),即多个过滤器组成一个链,依次处理,先处理第一个过滤器的doFilter()方法中的chain.doFilter()方法之前的内容,即图中左边大矩形中的“Code1”。之后通过chain.doFilter()方法将控制权交给下一个过滤器,执行下一个过滤器的doFilter()方法中的chain.doFilter()方法之前的内容,即图中中间大矩形中的“Code1”。以此类推,最后交给Servlet,执行Servlet的service()方法。service()方法执行完以后,控制权再交回给最后一个过滤器,执行过滤器的doFilter()方法中的chain.doFilter()方法之后的内容,即图中右边大矩形中的“Code2”,之后再回到倒数第二个过滤器,执行过滤器的doFilter()方法中的chain.doFilter()方法之后的内容。以此类推,最后返回客户端,在画面上显示请求结果[3]。其中链式过滤过程中也可以直接给出响应,即返回客户端,而不是向后传递。

[1]陈敏,唐溢键,周新志.用Servlet过滤器简化中文的输入和输出[J].成都信息工程学院学报,2005,20(2):129-133.

[2]谢志华.深入Java Servlet网络编程[M].西安:西安电子科技大学出版社,2004.

[3]柳永坡,刘雪梅,赵长海.JSP应用开发技术[M].北京:人民邮电出版社,2005.

黄玲(1980—),女,汉族,上海交通大学计算机及工商管理双学士学位,具备多年的对日开发经验,具备较强的日语、英语能力,2006年9月赴日从事软件开发工作,从事J2EE应用项目、嵌入式系统,手机软件开发等。

TP311.52

A

1009-6434(2016)05-0049-01

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!