Filter技术+职责链模式
2016-01-01 10:16
239 查看
Filter是一个过滤器,存在Webclient与请求的资源之间。这里的资源能够说是jsp或servlet。它的作用就是在请求达到资源之前,先对请求进行预处理。而且也能够对servlet处理后的response进行改动。
Filter能够是有非常多个。当一个个Filter组合成起来,就形成了一个FilterChain。也就是我们说的过滤链。这个过滤链处理的过程,就是我们前面学的职责链模式的一个体现。
以下是一个改动字符串的小样例:
1.FilterChain内包括各个子filter,利用dofilter()进行传递请求和响应
2.HTMLFilter:改动字符串的标签。请求过来之后,调用chain.dofilter()方法。继续传递请求。
3.SesitiveFilter:处理敏感词,请求过来之后。调用chain.dofilter()方法,发现没有下一个请求了,进行响应。
4.client方法:设置处理filter链的运行顺序
效果显示:
从效果显示的结果来看,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能够是有非常多个。当一个个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起作用。
相关文章推荐
- 2015年总结
- 2016/1/1 作业 两数是否相等输出较大值 矩形面积
- 基于jQuery实现返回顶部实例代码
- 文件I/O和标准I/O的区别
- xp用VMware9安装Ubuntu12.04后无法进入图像界面
- MTK穿戴设备开发代码分析
- android屏幕适配之精准适配
- RxAndroid使用方法
- cocos2d-x frameworks 和 cocos引擎的关系
- QQ项目分析系列一
- QQ项目分析系列一
- QQ项目分析系列一
- matlab练习程序(Sepia Tone滤镜)
- Bitset<>用于unordered container时的默认hash函数
- 面向对象的理解
- QT5下获取本机IP地址、计算机名、网络连接名、MAC地址、子网掩码、广播地址
- statusBarOrientation设备状态
- 集合内存管理
- 151214CarDemo
- tablevView实现惯性滑动到顶部时不反弹