【Java技术点滴】——Filter基本使用与扩展

背景

在程序实现的过程中我们往往碰到类似于这样的问题:为了防止后台接收数据不能乱码,我们需要在处理的Servlet中设置请求字符集,就会在每一个Servlet中加上这样的代码:

request.setCharacterEncoding("GB18030");

这样的代码就是在程序中写死了的,设置字符集的功能是不利于维护的,如果将来要修改为另外一种字符集类型,需要在每个Servlet中进行修改。如果要进行封装,同样面临每个Servlet都要调用的问题,而往往这种方法调用是与具体业务需求关系不大的。在这种情况下,是无法用正常的编程方式解决的。针对于此类问题,引入了类似于AOP思想的Filter技术。

基本介绍

Filter是Servlet2.3规范新增加的功能。使开发人员可以在用户请求到达Servlet之前改变request或者在Response离开Servlet是改变Response。

Filter作用示意图:

1.原始架构实现图

2.加入Filter

我们在Tomcat与Servlet之间加入了Filter类,在Web-Info配置中加入匹配规则以及相应配置,即可实现在Tomcat启动时,调用Filter的init方法进行初始化,在客户端进行操作时,对符合规则的操作,则Tomcat自动调用doFilter方法进行拦截处理,类似的道理,我们也可以对response对象进行操作。

 	<!--Filter配置,与Filter具体实现类对应-->
		<filter>
		<!--filter名称-->
  		<filter-name>CharsetEncodingFilter</filter-name>
		<!--对应具体实现类类-->
  		<filter-class>com.tgb.drp.util.filter.CharsetEncodingFilter</filter-class>
		<!--初始化参数,类似于键值对方式存取-->
  		<init-param>
  			<param-name>encoding</param-name>
  			<param-value>GBK</param-value>
  		</init-param>
  	</filter>
	<!--匹配规则配置-->
  	<filter-mapping>
  		<filter-name>CharsetEncodingFilter</filter-name>
  		<url-pattern>*.jsp</url-pattern>
  	</filter-mapping>

Filter与职责链模式

前面讨论了单个Filter的具体使用情况,那它具体是怎样体现职责链模式的呢?我们先回顾一下职责链模式的结构图:

职责链模式中,通过Client端设置具体处理者类的上家与下家,通过实现抽象类的抽象方法HandleRequest来具体处理某一个具体情况内的请求,如果不在处理范围内,则调用上家进行处理。

在Filter技术的应用中,Filter接口则对应了Handler抽象类,而我们不必调用SetSuccessor方法,在web.xml中就可以指定Filter的上下级调用关系,因此在doFilter方法中直接调用chain.doFilter方法即可执行继任者的doFilter方法,由此可见,Filter技术是职责链模式的更高级应用的体现。

Filter与Servelt

由以上内容可以看出,Filter与Servlet之间是层层包裹的关系,它通过拦截用户对Servlet的请求来提前或置后处理一些request或response的数据信息。

总结

Filter常用于权限控制、记录日志、转换编码格式、加密等与具体业务处理耦合性不高的功能上,我们可以认为它是一个执行过滤的插件,也可以形象的看作是滤网、过滤器。它提供了一种声明式的服务,具有着可插拔的能力,达到了更好的复用。

参考资料

Java Filter过滤机制详解

Java Filter的执行顺序

Java中Filter、Servlet、Listener的学习

时间: 2024-10-02 22:59:23

【Java技术点滴】——Filter基本使用与扩展的相关文章

【Java技术点滴】——代理模式及其对事务封装

背景 项目中我们会遇到这样的情况:在几个方法中加入相同的代码,这些代码是与业务无关的,并且以后有可能由于考虑不周或需求变动再或者是其他原因,我们需要对他们进行逐一进行改动.举个具体的例子,比如程序中的日志控制.事务控制等,这些功能是与业务无关的,但却需要将它们与我们的逻辑混在一起,达到一些特殊的需求. 这样的情况往往代码都是相同的,可以抽离出来,为了复用,我们可以将这些相同的代码单独封装成的方法,以供其他需要的地方调用,这样对于以后的修改就做到了只修改一处的效果,达到了程序的复用,但另外一个问题

【Java技术点滴】——XML解析方式比较

为什么? "它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据.是Internet环境中跨平台的.依赖于内容的技术,也是当今处理分布式结构信息的有效工具."XML被设计用来传输和存储数据: 他的平台无关性.语言无关性.系统无关性,给数据继承与交互带来了极大的方便.也因此使用XML的地方越来越常见. 方式 1.DOM--DocumentObject Model 像操作HTML

【Java技术点滴】——ThreadLocal封装JDBC事务操作

背景 在Java程序实现中,我们往往应用到事务的机制,在业务层进行事务开启,创建数据库连接,调用Dao层方法进行数据库访问,过程中需要将数据库连接Connection作为参数传递给Dao层方法.显而易见,这样的实现不利于Dao层方法的复用,当在不使用事务的情况下,我们是需要在Dao层方法中创建数据库连接的,这样Dao层方法免去Connection参数就可以使得方法更加独立.明确了,怎样解决这样的尴尬?对于此,我们使用了ThreadLocal进行解决. 基本介绍 "本地线程变量",可以理

【Java技术点滴】——JSTL教程之分层思想

是什么? JSTL(JSP Standard TagLibrary,JSP标准标签库)是一个不断完善的开放源代码的JSP标准标签库,是Sun的一个标准,由apache的jakarta小组来实现.维护的. 为什么? 使用JSTL的最大的目的是帮助简化JSP页面作者(这个职位称为pageauthor)的日常工作.page author是指负责使用JSP实现Web应用程序表示层的人员.许多page author是不擅长使用任何编程语言的. page author面临着使用一种脚本语言(也因此他们被看成

【Java技术点滴】——精简实现图片处理

 引言: 对于图片的处理是很多项目中都会用到的,如一般的人事管理系统等,处理方式主要分为两大类: 1.图片文件存储与磁盘中,数据库中只保存相对应的文件名: 2.文件采用二进制的形式保存于数据库中. 第二种方案占用空间大,并且对二进制流的操作也较为占用资源,因此采用第一种方案进行处理的情况较为常见,常用于一般的系统应用中,正在进行中的drp项目中用到了图片上传.显示的功能处理,采用commons-fileupload1.1.1版本,可以实现多文件的上传功能. 实现: 引入相关jar包后,对方法

Java Web 基础 --- Filter 综述

摘要: 伴随J2EE一起发布的Servlet规范中还包括一个重要的组件--过滤器(Filter).过滤器可以认为是Servlet的一种加强版,它主要用于对用户请求进行预处理以及对服务器响应进行后处理,是个典型的处理链.Servlet规范使用了三个接口对过滤器进行了抽象,即Filter是对具体过滤器的抽象,FilterChain是基于AOP理念对责任链方面的抽象,FilterConfig则是对Filter配置的抽象.本文概述了Filter的提出动机.工作原理.使用流程和应用实例,并指出Java W

Java技术的特点

Java技术是一套完整的IT行业解决方案,其中包含了很多技术.最初是从解决家电设备联网通讯的方案发展起来的,其特点适用于Internet,于是在Internet广泛应用的环境下,迅速发展成为一种计算机语言.一个平台.一个网络计算的架构. 从整体上划分,Java技术可分成Java编程语言和Java平台.Java编程语言是一种高级编程语言,Java平台是指程序运行的硬件或软件环境. Java编程语言的特征: 1.简单易用 2.面向对象 3.跨平台,可移植 4.多线程 5.健壮性 6.安全性 7.动态

java技术栈:一、java编程语言概述

Java是一种编程语言,起源于20世纪90年代初Sun公司的一个叫Green的项目,该项目主要目的是是开发嵌入家用电器的分布式软件系统,从而使电器更加智能化.因为项目小组成员皆为C++的高手(那个年代正式C++流行的年代),于是采用C++进行系统开发,但在开发过程中发现C++语言本身的特性所导致的问题无法有效的解决,比如:过于复杂.安全性差等.于是项目小组只好另辟蹊径,在"简单的.可靠的.紧凑的并易于移植的"的框架内开发了一个小型的计算机语言,用于编写消费者的电子产品中的程序,当时这款

Java技术综述

自己打算好好学习下Java,所以想先明晰Java开发中到底有哪些技术,以便以后学习的过程中,可以循序渐进,随着学习的深入,本文将不断更新. Java基础教程将Java的入门基础知识贯穿在一个实例中,逐步深入,可以帮助你快速进入Java编程的世界.万事开头难,逐步跟着这个教程走一遍,对Java应该就会有一种入门的感觉了.然后再去学习更高级的主题,或者更深入地学习其中的某些知识点. 首先学习Java的一些基础知识,包括: Java开发环境安装与配置 Eclipse的安装与使用 面向对象基础 基本数据