这两件事都有点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清除?
待研究
分享到:
相关推荐
如果try块抛出的异常与catch块的异常类型匹配,那么相应的catch块的代码将被执行。 3. **finally关键字**:无论try和catch块的结果如何,finally块中的代码总会被执行。它常用于释放资源,如关闭文件、数据库连接或...
本节课程将深入探讨Java中的异常处理机制,包括异常的分类、抛出与捕获、finally块以及自定义异常。 1. **异常的分类**: Java中的异常主要分为两种类型:检查性异常(Checked Exceptions)和运行时异常...
- 行为型模式:策略、模板方法、观察者、迭代器、责任链、命令、备忘录、解释器。 以上只是《疯狂Java面试题》中可能涵盖的部分关键知识点,实际内容会更详尽,包括对每个知识点的深度剖析和面试常见问题。通过...
- 行为型模式:策略、模板方法、观察者、迭代器、责任链、命令、备忘录、解释器。 以上只是Java面试中可能涉及的部分知识点,面试时还需要结合实际项目经验、问题解决能力、技术趋势等方面进行综合考察。不断学习...
- **责任链模式**:过滤器链也可以被视为责任链模式的应用,每个过滤器都是链上的一个节点,决定是否处理数据或传递给下一个过滤器。 5. **最佳实践**: - **错误处理**:确保每个过滤器都有适当的错误处理机制,...
7. **异常链**:Java允许通过`initCause()`方法创建异常链,显示异常之间的因果关系。 通过这个"关于Java异常的练习",你可以实践如何有效地处理异常,理解何时使用不同的关键字,以及如何编写符合最佳实践的异常...
- 行为型模式(观察者、模板方法、策略、责任链、命令、迭代器、访问者) 10. 框架应用: - Spring框架的IoC(Inversion of Control)和AOP(Aspect-Oriented Programming) - MVC架构模式的理解 - Spring Boot...
在Java编程中,异常处理是确保程序健壮性与稳定性的重要环节。然而,许多开发者在实际操作中常常陷入一些常见的异常处理误区,这不仅可能导致程序的错误难以追踪,还可能影响程序性能。以下是对Java异常处理的一些...
- 行为型模式:观察者、策略、模板方法、迭代器、责任链、命令、备忘录、解释器等。 9. **Java 8及更高版本新特性** - Lambda表达式:函数式编程的引入,简化匿名内部类。 - Stream API:处理集合数据的新方式,...
- 行为型模式:策略、模板方法、迭代器、观察者、责任链、命令、解释器、备忘录、状态、访问者。 以上是Java程序员面试中可能遇到的核心知识点,掌握这些内容将有助于在面试中展现出扎实的编程基础和解决问题的...
此外,`throws`关键字用于方法签名,表示该方法可能会抛出异常,将异常处理的责任转移给调用者。这适用于检查性异常,而不是运行时异常。 在编写异常处理代码时,有几点最佳实践需要注意: 1. 尽量避免空的`catch`...
3. 行为型模式:如策略、模板方法、观察者、责任链、迭代器、访问者、命令、备忘录、解释器模式。 十、Java新特性 1. Lambda表达式:学习如何使用匿名函数简化代码。 2. Stream API:掌握流式编程,实现更简洁的...
13. **设计模式**:了解单例、工厂、观察者、装饰者、适配器、策略、代理、建造者、责任链等经典设计模式的原理和应用场景。 14. **JVM优化**:JVM调优的基本思路,JVM参数设置,性能监控工具(jconsole, jvisualvm...
8. **异常链**:当一个异常在处理另一个异常的过程中被抛出,它们之间可以形成链式关系,提供更详细的错误信息。 9. **自定义异常**:通过创建新的异常类并继承自Exception或其子类,可以创建自己的异常类型,以便...
如果在try块中发生异常,程序将立即跳转到与该异常类型匹配的catch块。 2. **catch**:catch块用于捕获特定类型的异常。可以有多个catch块,每个捕获不同类型的异常。一旦捕获到异常,catch块内的代码将被执行。...
在方法签名中使用`throws`声明可能会抛出的检查异常,这将异常的处理责任转移到调用者。 九、全局异常处理器 在Android中,可以通过注册Application的UncaughtExceptionHandler来处理全局未捕获的异常,防止应用因...
3. 行为型模式:命令、责任链、解释器、迭代器、中介者、备忘录、观察者、状态、策略、模板方法模式。 以上知识点涵盖了Java达内面试题库的主要内容,每个部分都值得深入学习和实践。对于准备Java面试的程序员来说...
- 行为型模式:如策略、模板方法、访问者、迭代器、观察者、责任链、命令、解释器模式。 以上只是Java面试中的一部分常见知识点,实际面试可能还会涉及反射、并发编程、NIO、Spring框架、数据库操作、算法与数据...
- 行为型模式:模板方法、观察者、迭代器、责任链、命令、策略、状态、访问者、备忘录、解释器。 9. **反射与注解** - 反射API:Class类、Constructor类、Method类、Field类的使用。 - 注解的定义、使用和元注解...