Filter的原理及应用(例统一设置字符集)

本文详细介绍了Filter技术的概念及其在Web应用中的使用方式。Filter能够在请求到达Servlet之前预处理请求,并在响应离开Servlet时处理响应,实现了面向切面编程的思想。文章还提供了具体的实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 Filter简介

Filter技术在server2.3规范中加入的,大部分的jsp/servlet容器都支持。和AOP一样都体现了面向切面编程的思想,Filter可以看做是一种横切性的技术,同时体现了一种责任链模式(执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请求的内容。而在实际使用时,就要特别注意这种责任链的执行顺序问题和模板方法模式。Filter其实提供了一种声明式服务,具有可插拔的能力。

  

Filter功能

 Filter最重要的就是filter功能。它使用户可以改变一个request和修改一个response。Filter其实对RequestResponse请求进行了拦截,只对Post请求起作用。tomcat一启动就会new一个Filter。Filter不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在response离开servlet时处理response。换种说法,filter其实是一个“servletchaining“(servlet 链)。


包括

1. 在servlet被调用之前截获;

2. 在servlet被调用之前检查servlet request;

3.根据需要修改request头和request数据;

4.根据需要修改response头和response数据;

5. 在servlet被调用之后截获.

你能够配置一个filter 到一个或多个servlet;单个servlet或servlet组能够被多个filter 使用。几个实用的filter包括:用户辨认filter,日志filter,审核filter,加密filter,符号filter,能改变xml内容的XSLT filter等。

一个filter必须实现javax.servlet.Filter。

 

Fliter接口方法

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

Public void public void destroy()


2.//初始化filter

public void init(FilterConfig filterConfig)


3.//执行filter 的工作.调用doFilter方法多次以处理不同的请求

void doFilter(ServletRequest req,ServletResponse res,FilterChain chain) 


每一个filter从doFilter()方法中得到当前的request及response.在这个方法里,可以进行任何的针对request及response的操作(包括收集数据,包装数据等)。filter调用chain.doFilter()方法把控制权交给下一个filter。一个filter在doFilter()方法中结束,如果一个filter想停止request处理而获得对response的完全的控制,那它可以不调用下一个filter.



FilterChain接口

1.如何实例化

代表当前 Filter 链的对象。由容器实现,容器将其实例作为参数传入过滤器对象的doFilter()方法中

2.作用

调用过滤器链中的下一个过滤器


Fliter使用

下面是一段简单的日志filter用来记录所有request的持续时间.

创建统一字符集处理的类

/**
 * 采用Filter统一处理字符集
 * @author Administrator
 *
 */
public class CharsetEncodingFilter implements Filter {
	
	private String endcoding; 
	
	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		//设置字符集
		request.setCharacterEncoding(endcoding);
		
		//继续执行
		chain.doFilter(request, response);
	}

	public void init(FilterConfig filterConfig) throws ServletException {
		this.endcoding = filterConfig.getInitParameter("encoding");
	}

}


Web.xml里面配置filter信息

<filter>
		<filter-name>CharsetEncodingFilter</filter-name>
		<filter-class>com.bjpowernode.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-mapping>
		<filter-name>CharsetEncodingFilter</filter-name>
		<url-pattern>/servlet/*</url-pattern>
	</filter-mapping>

这样就相当于在每个请求jsp或servlet时单独加入request.setCharacterEncoding("GB18030")这句话的作用。

如果有多个filter,那么只要在web.xml按照所需要的拦截顺序配置filter即可。

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值