Filter是一个过滤器,存在Webclient与请求的资源之间。这里的资源能够说是jsp或servlet。它的作用就是在请求达到资源之前,先对请求进行预处理。而且也能够对servlet处理后的response进行改动。

Filter能够是有非常多个。当一个个Filter组合成起来,就形成了一个FilterChain。也就是我们说的过滤链。这个过滤链处理的过程,就是我们前面学的职责链模式的一个体现。

以下是一个改动字符串的小样例:

1.FilterChain内包括各个子filter,利用dofilter()进行传递请求和响应

public class FilterChain implements Filter {
List<Filter> filters = new ArrayList<Filter>(); //定义一个存放filter的集合
int index = 0;
public FilterChain addFilter(Filter f){
this.filters.add(f); //加入Filte
return this;
}
@Override
public void doFilter(Request request, Response response,FilterChain chain) {
//循环遍历每个Filter
if(index == filters.size()) return;
Filter f = filters.get(index);
index ++;
//而且利用doFilter()方法接收request和response
f.doFilter(request, response, chain);
}
}

2.HTMLFilter:改动字符串的标签。请求过来之后,调用chain.dofilter()方法。继续传递请求。

package com.bjsrt.dp.filter;
public class HTMLFilter implements Filter {
@Override
public void doFilter(Request request, Response response,FilterChain chain) {
System.out.println("FilterChain调用dofilter(),获取HTMLFilter的请求命令!");
request.requestStr = request.requestStr.replace('<', '[')
.replace('>', ']')+"----HTMLFilter()";
chain.doFilter(request, response, chain);
response.responseStr += "----HTMLFilter()";
System.out.println("获取HTMLFilter的请求响应! ");
}
}

3.SesitiveFilter:处理敏感词,请求过来之后。调用chain.dofilter()方法,发现没有下一个请求了,进行响应。

package com.bjsrt.dp.filter;

public class SesitiveFilter implements Filter {
@Override
public void doFilter(Request request, Response response,FilterChain chain) {
System.out.println("调用SesitiveFilter的dofilter方法。获取请求命令!!");
request.requestStr = request.requestStr.replace("被就业", "就业")
.replace("敏感,","")+"-----SesitiveFilter()";
chain.doFilter(request, response, chain);
response.responseStr +="--SesitiveFilter()";
System.out.println("获取SesitiveFilter的请求响应! ");
}
}

4.client方法:设置处理filter链的运行顺序

package com.bjsrt.dp.filter;

public class Main {
public static void main(String[] args) { String msg = "大家好:),<script>,敏感,被就业。网络授课没感觉,由于看不见大家伙儿"; //这是一个消息(request)
Request request = new Request();
request.setRequestStr(msg);
Response response = new Response();
response.setResponseStr("response");
FilterChain fc = new FilterChain(); //设置请求处理的顺序
fc.addFilter(new HTMLFilter())
.addFilter(new SesitiveFilter());
fc.doFilter(request, response,fc); //打印出请求和响应
System.out.println(request.getRequestStr());
System.out.println(response.getResponseStr());
} }

效果显示:

从效果显示的结果来看,FilterChain的运行顺序遵循先进后出的原则:当Webclient发送一个request的时候,这个request先是会经过FilterChain,由它利用dofilter()方法调用各个子filter,至于子filter的运行顺序怎样。则看client是怎样制定规则的。request被第一个处理之后,又通过dofilte()往下传送。被第二个、第三个...filter截获处理。当request被所求的资源处理之后,返回的顺序是从最后一个開始进行返回,直到返回到client。

filterChain的处理非常好的体现了职责链模式。其实 filterChain的在java中已经封装好了,并不须要我们去实现,我们仅仅须要调用其dofilter()的方法,进行传递request和response。而filter的运行顺序是放在xml配置文件进行配置。

总结:Filter技术是对请求到jsp或servlet的request和response进行拦截,能够进行一系列的处理,处理之后又传递给下一个。

filter技术也是将反复性的服务抽出来。放在配置文件里。

到时候我们改动的时候。仅仅须要到配置文件里改动,就能对全部的jsp和servlet起作用。

Filter技术+职责链模式的更多相关文章

  1. Filter体现职责链模式

    1. 前言 Filter—Filter 技术是servlet2.3 新增加的功能.完成的流程:对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后 ...

  2. 设计模式之职责链模式(Chain of Responsibility)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  3. 设计模式---数据结构模式之职责链模式(Chain of Responsibility)

    一:概念 职责链模式(CoR,Chain of Responsibility)是行为模式之一,该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的对象之间像链条一样紧密相连,所以被 ...

  4. JS设计模式(10)职责链模式(重要)

    什么是职责链模式? 重要性:4 星,在项目中能对 if-else 语句进行优化 定义:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到 ...

  5. 18职责链模式CoR

    一.什么是职责链模式 Chain of Responsibility(CoR)模式也叫职 责链模式或者职责连锁模式,是行为模式之一, 该模式构造一系列分别担当不同的职责的类的对 象来共同完成一个任务, ...

  6. java设计模式-----18、职责链模式

    概念: Chain of Responsibility(CoR)模式也叫职责链模式.责任链模式或者职责连锁模式,是行为模式之一,该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的 ...

  7. Java职责链模式

    一.定义 职责链模式,就是将能够处理某类请求事件的一些处理类,类似链条的串联起来.请求在链条上处理的时候,并不知道具体是哪个处理类进行处理的.一定程度上实现了请求和处理的解耦. 实际生活中的经典例子就 ...

  8. JavaScript之职责链模式

    一.概述 职责链模式(Chain of responsibility),就是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有 ...

  9. C#设计模式系列:职责链模式(Chain of Responsibility)

    1.职责链模式简介 1.1>.定义 职责链模式是一种行为模式,为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求.将这些对象连接成一条链,并沿着这条链传递该请求,直到有一个对 ...

随机推荐

  1. Hadoop SequenceFile

    SequenceFile格式: 每一个SequenceFile都包含一个“头”(header).Header包含了以下几部分. 1.SEQ三个字母的byte数组 2.Version number的by ...

  2. 组件接口(API)设计指南[4]-通知(Notifications)

    *返回文件夹阅读其它章节: http://blog.csdn.net/cuibo1123/article/details/39894477 通知(Notifications) 通知是托付协议的还有一半 ...

  3. 50个Android开发技巧(11 为文字加入特效)

    问题:怎样构建一个模拟LED数字时钟的页面?效果例如以下图所看到的: (原文地址:http://blog.csdn.net/vector_yi/article/details/24460227) 分析 ...

  4. maven生成war包的两种方式

    war包即对WEB应用程序进行打包,用于应用容器的部署.如在jboss中只要把war包丢入deploy目录下即可发布自己的应用了.打包方式有很多中,很多工具本身就支持此功能.下面主要介绍通过maven ...

  5. 性能测试之LoardRunner 自动关联

    1.什么是自动关联? 2.实例介绍 以下是详细介绍: 自动化关联:它是VuGen提供的自动化扫描关联处理策略,它的原理是对同一个脚本运行和录制时的服务器返回进行比较,来自动查找变化的部分,并且提示是否 ...

  6. 【VBA研究】VBA通过HTTP协议实现邮件轨迹跟踪查询

    作者:iamlasong 1.接口说明 通过互联网訪问,运单跟踪信息查询接口基于HTTP协议开发,接口为RESTFul风格的Web Service,信息交互过程为用户按我方提供的web service ...

  7. JQuery Ajax实例总结

    jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯. 废话少说,直接进入正题,我们先来看一些简单的方法,这些方法都是对 ...

  8. 百度地图SDK for Android v2.1.2全新发布

    2013年6月20日 Android SDK:V2.1.2产品上线 新增: 自定义指南针位置(类:MapController,方法:setCompassMargin) 自定义当前位置图标(类:MyLo ...

  9. shell oracle

    #!/bin/sh traffic= rm -rf test.txt data=`sqlplus -S anoscfg/anoscfg <<EOF spool test.txt set f ...

  10. IOS UITableView单条刷新,数据不刷新解决方案

    在使用 UITableView 进行某设置页面的设计时,由于设计页面有固定的section个数和row个数,而数据又需要根据用户的修改情况进行改变,所以我们往往不会为每个cell单独写一个类,而是直接 ...