责任链与finally

这两件事都有点2。只是想验证一下这种场景下,finally到底怎么执行。

简单的Filter链,只是为了验证。

 

public interface Filter {

	 void doFilterHttp(Object request, Object response, FilterChain chain);
}

 

 

 

public class FilterChain {
	private List<FilterConfig> filterConfigs = new ArrayList<FilterConfig>();
	private Iterator<FilterConfig> iterator = null;
	
	public void doFilter(Object request,Object response){
		if(this.iterator==null){
			this.iterator=filterConfigs.iterator();
		}
		if(this.iterator.hasNext()){
			FilterConfig config=this.iterator.next();
			Filter filter=config.getFilter();
			filter.doFilterHttp(request, response, this);
		}
	
	}
	
	public void addFilterConfig(FilterConfig config){
		this.filterConfigs.add(config);		
	}
}

 

 

    

 

public class FilterConfig {

	private Filter filter;

	public Filter getFilter() {
		return filter;
	}

	public void setFilter(Filter filter) {
		this.filter = filter;
	}
	
	
}

 

 

 

public class Test1Filter implements Filter {

	public void doFilterHttp(Object request, Object response, FilterChain chain) {
		 try{
			 System.out.println("handle filter"+this.getClass().getName());
			 chain.doFilter(request, response);
		 }finally{
			 System.out.println(this.getClass().getName()+" finally");
		 }

	}

}

 

 

 

 

public class Test2Filter extends Test1Filter {

}

 

 

 

public class Test3Filter implements Filter {

	public void doFilterHttp(Object request, Object response, FilterChain chain) {
	
		 if(true){
			 System.out.println("handle filter"+this.getClass().getName());
			 chain.doFilter(request, response);
			 return  ;
		 }	
		 
		try{
			 System.out.println(this.getClass().getName()+" try");
		}finally{
			 System.out.println(this.getClass().getName()+" finally");
		}

	}

}

 

 

 

public class Test4Filter implements Filter {

	public void doFilterHttp(Object request, Object response, FilterChain chain) {
		try{
		 if(true){
			 System.out.println("handle filter"+this.getClass().getName());
			 chain.doFilter(request, response);
			 return  ;
		 }	
		 
	
			 System.out.println(this.getClass().getName()+" try");
		}finally{
			 System.out.println(this.getClass().getName()+" finally");
		}
		
	}

	 

}

 

  来看测试:

 

public class FilterTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		FilterChain chain=new FilterChain();
		Test1Filter filter1=new Test1Filter();
		Test2Filter filter2=new Test2Filter();
		Test3Filter filter3=new Test3Filter();
		Test4Filter filter4=new Test4Filter();
		FilterConfig config1=new FilterConfig();
		config1.setFilter(filter1);
		
		FilterConfig config2=new FilterConfig();
		config2.setFilter(filter2);
		
		FilterConfig config3=new FilterConfig();
		config3.setFilter(filter3);
		
		FilterConfig config4=new FilterConfig();
		config4.setFilter(filter4);
		
		chain.addFilterConfig(config1);
		chain.addFilterConfig(config3);
		chain.addFilterConfig(config4);
		chain.addFilterConfig(config2);
		
		chain.doFilter(null, null);
	}

}

 

handle filter org.jport.sample.designpattern.responsebilitychain.Test1Filter

handle filter org.jport.sample.designpattern.responsebilitychain.Test3Filter

handle filter org.jport.sample.designpattern.responsebilitychain.Test4Filter

handle filter org.jport.sample.designpattern.responsebilitychain.Test2Filter

org.jport.sample.designpattern.responsebilitychain.Test2Filter finally

org.jport.sample.designpattern.responsebilitychain.Test4Filter finally

org.jport.sample.designpattern.responsebilitychain.Test1Filter finally

 

如果chain.doFilter在try{}finally{}块中,那么finally是一定会执行的。加了return后也一样。只不过return后面的语句不再执行了而已。



只是不太明白Spring Security中这样的写法:
  try {
            // This is the only place in this class where SecurityContextHolder.setContext() is called
            SecurityContextHolder.setContext(contextBeforeChainExecution);

            chain.doFilter(request, responseWrapper);
        }
        finally {
            // This is the only place in this class where SecurityContextHolder.getContext() is called
             SecurityContext contextAfterChainExecution = SecurityContextHolder.getContext();

            // Crucial removal of SecurityContextHolder contents - do this before anything else.
            SecurityContextHolder.clearContext();


 难道是说,我执行完Filter之后,执行Controller,都渲染完了再回来执行这个方法?从线程中把SecurityContext清除?
待研究

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值