JavaEE过滤器处理原理

标签: javaee 过滤器 原理 | 发表时间:2012-12-01 21:46 | 作者:
出处:http://www.iteye.com

     大家都知道JavaEE中的Filter是用了责任链模式来实现的,请求值先到达Filter,根据Filter在web.xml的配置顺序一个个按顺序地处理,处理完以后,再按反顺序来处理响应信息,有点像是一个栈(先处理请求的Filter,后处理响应)。下面就山寨一下它的实现,来说明它的实现原理。

package myself.filter;

/**
 * 请求
 * @author zyb
 * @since 2012-12-1
 *
 */
public class Request {

	private String value;

	public String getValue() {
		return value;
	}

	public void setValue(String value) {
		this.value = value;
	}

}
 package myself.filter;
/**
 * 响应
 * 
 * @author zyb
 * @since 2012-12-1
 * 
 */
public class Response {

	private String value;

	public String getValue() {
		return value;
	}

	public void setValue(String value) {
		this.value = value;
	}

}

 package myself.filter; 

/**
 * 过滤器接口
 * @author zyb
 * @since 2012-12-1
 *
 */
public interface Filter {

	/**
	 * 处理请求和响应
	 * @param request		请求
	 * @param response		响应
	 * @param chain			过滤器链
	 */
	void doFilter(Request request, Response response, FilterChain chain);
	
}

 package myself.filter; 

import java.util.ArrayList;
import java.util.List;

/**
 * 过滤器链
 * @author zyb
 * @since 2012-12-1
 *
 */
public class FilterChain implements Filter { // 在JavaEE的FilterChain源码中并没有实现Filter接口
	
	// 用于保存所有要处理的过滤器
	private List<Filter> filters = new ArrayList<Filter>();
	
	// 索引,用于记数
	private int index = 0;
	
	@Override
	public void doFilter(Request request, Response response, FilterChain chain) {
		// 如果所有的过滤器都已经处理完
		if (index == filters.size()) {
			return;
		}
		// 取出相应的过滤器
		Filter filter = filters.get(index);
		// 索引加1
		index++;
		// 调用具体的过滤器处理请求和响应
		filter.doFilter(request, response, chain);
	}

	// 往过滤器链中添加过滤器
	public void addFilter(Filter filter) {
		this.filters.add(filter);
	}
}

 package myself.filter;

/**
 * 客户端程序
 * @author zyb
 * @since 2012-12-1
 *
 */
public class Client {

	public static void main(String[] args) {
		Request request = new Request();
		request.setValue("abcd");
		Response response = new Response();
		FilterChain filter = new FilterChain();
		
		// 将请求值变成大写字母
		filter.addFilter(new Filter() {
			
			@Override
			public void doFilter(Request request, Response response, FilterChain chain) {
				System.out.println("第一个Filter处理...请求值:" + request.getValue());
				StringBuilder sb = new StringBuilder();
				for (int i = 0; i < request.getValue().length(); i++) {
					sb.append((char) (request.getValue().charAt(i) - 32));
				}
				Response result = new Response();
				result.setValue(sb.toString());
				chain.doFilter(request, response, chain);
				System.out.println("第一个Filter响应...响应值:" + result.getValue());
				
			}
		});
		
		// 将请求值加1
		filter.addFilter(new Filter() {
			
			@Override
			public void doFilter(Request request, Response response, FilterChain chain) {
				System.out.println("第二个Filter处理...请求值:" + request.getValue());
				StringBuilder sb = new StringBuilder();
				for (int i = 0; i < request.getValue().length(); i++) {
					sb.append((char) (request.getValue().charAt(i) + 1));
				}
				Response result = new Response();
				result.setValue(sb.toString());
				chain.doFilter(request, response, chain);
				System.out.println("第二个Filter响应...响应值:" + result.getValue());
			}
		});
		
		filter.doFilter(request, response, filter);
	}
}

打印信息:

第一个Filter处理...请求值:abcd

第二个Filter处理...请求值:abcd
第二个Filter响应...响应值:bcde
第一个Filter响应...响应值:ABCD

打印的信息跟前面说的是一致的,先进后出。。呵


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [javaee 过滤器 原理] 推荐:

JavaEE过滤器处理原理

- - ITeye博客
     大家都知道JavaEE中的Filter是用了责任链模式来实现的,请求值先到达Filter,根据Filter在web.xml的配置顺序一个个按顺序地处理,处理完以后,再按反顺序来处理响应信息,有点像是一个栈(先处理请求的Filter,后处理响应). 下面就山寨一下它的实现,来说明它的实现原理.

[JavaEE - JPA] 性能优化: 如何定位性能问题

- - CSDN博客编程语言推荐文章
要想解决性能问题,首先得要有办法定位问题,明白问题究竟是什么. 本来JPA的存在目的就是为了让开发人员能够更少地直接操作SQL,但是由于业务自身有其复杂性,如果开发人员不老练,没有踩过许许多多形形色色的坑,是很难写出高质量的JPA代码的,这也是为什么很多人说Hibernate(JPA)入门容易,精通难.

FreeMarker 快速入门 - JavaEE教程 - SegmentFault 思否

- -
FreeMarker 快速入门. FreeMarker是一个很值得去学习的模版引擎. 它是基于模板文件生成其他文本的通用工具. 本章内容通过如何使用FreeMarker生成Html web 页面 和 代码自动生成工具来快速了解FreeMarker. FreeMarker是一款用java语言编写的模版引擎,它虽然不是web应用框架,但它很合适作为web应用框架的一个组件.

JQuery内容过滤器

- - CSDN博客推荐文章
jQuery的选择器非常众多,下面介绍其中的一种,内容过滤器. 内容过滤器顾名思义就是根据内容进行选择的一种. 选择器,下面我们来举例一下这个内容过滤器的使用方法. 使用jQuery内容过滤器. $(function(){//显示包含给定文本的元素. $(function(){//显示所有不包含子元素或者文本的空元素.

Hbase 布隆过滤器BloomFilter介绍

- - CSDN博客推荐文章
bloom filter的数据存在StoreFile的meta中,一旦写入无法更新,因为StoreFile是不可变的. Bloomfilter是一个列族(cf)级别的配置属性,如果你在表中设置了Bloomfilter,那么HBase会在生成StoreFile时包含一份bloomfilter结构的数据,称其为MetaBlock;MetaBlock与DataBlock(真实的KeyValue数据)一起由LRUBlockCache维护.

Wireshark 过滤器语法 - 粪球

- - 博客园_首页
 wireshark有两种过滤器:.  捕捉过滤器(CaptureFilters):用于决定将什么样的信息记录在捕捉结果中. 显示过滤器(DisplayFilters):用于在捕捉结果中进行详细查找. 捕捉过滤器 (此过滤器不需要比较运算符,查询关键字请全部小写). 捕捉过滤器是数据经过的第一层过滤器,它用于控制捕捉数据的数量,以避免产生过大的日志文件.

一个用于白名单服务的布隆过滤器(bloom filter)

- - CSDN博客架构设计推荐文章
      bloom filter这种数据结构用于判断一个元素是否在集合内,当然,这种功能也可以由HashMap来实现. bloom filter与HashMap的区别在于,HashMap会储存代表这个元素的key自身(如key为"IKnow7",那么HashMap将存储"IKnow7"这12个字节(java),其实还需要包括引用大小,但java中相同string只存一份),而bloom filter在底层只会使用几个bit来代表这个元素.

使用@WebFilter过滤器中设置例外URL的一种方式

- - 编程语言 - ITeye博客
        if (null!=excludedPages && excludedPages.length()!=0) { // 例外页面不为空   .         for (String page : excludedPageArray) {// 遍历例外url数组   .             // 判断当前URL是否与例外页面相同.

Spring Security 实战干货:图解Spring Security中的Servlet过滤器体系

- - SegmentFault 最新的文章
我在 Spring Security 实战干货:内置 Filter 全解析对 Spring Security的内置过滤器进行了罗列,但是 Spring Security真正的过滤器体系才是我们了解它是如何进行"认证"、“授权”、“防止利用漏洞”的关键. Servlet Filter体系. 这里我们以 Servlet Web为讨论目标, Reactive Web暂不讨论.

详谈布隆过滤器在亿级流量电商系统的应用

- - 掘金 架构
本文已参与「新人创作礼」活动,一起开启掘金创作之路. 布隆过滤器在实际中发挥着非常重要的作用,一呢可以防止网站被攻击,二呢可以提高系统的性能. 接下来我们通过实际案例进行讲解. 例如在电商平台,下面商品访问的地址为 https://item.jd.com/ 857.html,其中 857 是商品的 SKU.