zoukankan      html  css  js  c++  java
  • Filter技术+职责链模式

         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起作用。  



  • 相关阅读:
    Jmeter22:同步定时器-集合点功能
    Jmeter21:固定定时器-死等的方法
    Jmeter20:上传与下载
    Jmeter19:token接口
    Jmeter18:cookie接口-请求提示no cookie的解决方法
    Jmeter17:json提取器-提取数据的方法
    Jmeter16:forEach控制器-针对,在不知道取到得参数有多少?但是要全部执行每一条的情况
    Jmeter15:仅一次控制器-针对在每个并发用户都要调用一次的情况
    Jmeter14:随机顺序执行器-每个请求都执行,当是顺序打乱的情况
    Jmeter13:常用的逻辑控制器-if-随机-仅一次-switch...
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5093043.html
Copyright © 2011-2022 走看看