javaWeb开发之拦截器和过滤器的区别

拦截器和过滤的关系图

 

拦截器和过滤器简要区别

1、拦截器是基于java的反射机制的,而过滤器是基于函数回调。
2、拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
6、拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

 

 

拦截器和过滤器的详细区别

FilterInterceptorSummary
Filter 接口定义在 javax.servlet 包中 接口 HandlerInterceptor 定义在org.springframework.web.servlet 包中  
Filter 定义在 web.xml 中    
Filter在只在 Servlet 前后起作用。Filters 通常将 请求和响应(request/response) 当做黑盒子,Filter 通常不考虑servlet 的实现。 拦截器能够深入到方法前后、异常抛出前后等,因此拦截器的使用具有更大的弹性。允许用户介入(hook into)请求的生命周期,在请求过程中获取信息,Interceptor 通常和请求更加耦合。 在Spring构架的程序中,要优先使用拦截器。几乎所有 Filter 能够做的事情, interceptor 都能够轻松的实现
Filter 是 Servlet 规范规定的。 而拦截器既可以用于Web程序,也可以用于Application、Swing程序中。 使用范围不同
Filter 是在 Servlet 规范中定义的,是 Servlet 容器支持的。 而拦截器是在 Spring容器内的,是Spring框架支持的。 规范不同
Filter 不能够使用 Spring 容器资源 拦截器是一个Spring的组件,归Spring管理,配置在Spring文件中,因此能使用Spring里的任何资源、对象,例如 Service对象、数据源、事务管理等,通过IoC注入到拦截器即可 Spring 中使用 interceptor 更容易
Filter 是被 Server(like Tomcat) 调用 Interceptor 是被 Spring 调用 因此 Filter总是优先于interceptor执行

 

 

 

 

 

 

 

 

 

 

 

 

 

 

拦截器和过滤器的权威区别

根据《Java Web整合开发王者归来》一书的第28章第二节(目录结构如下):

第28章 Spring的AOP模块 671
28.1 实例:使用拦截器拦截方法 671
28.1.1 Service接口 671
28.1.2 Service实现代码 671
28.1.3 方法前拦截器检查name是否为null 672
28.1.4 返回后拦截器输出返回值 673
28.1.5 异常拦截器捕获异常 673
28.1.6 拦截器配置 674
28.1.7 运行代码 675
28.2 拦截器与Filter的区别 676
28.3 AOP的相关概念 676
28.4 AOP的代理模式 677
28.4.1 ProxyFactoryBean代理工厂对象 677
28.4.2 TransactionProxyFactoryBean事务代理工厂对象 677
28.5 本章小结 678

 截图如下:

文字描述如下:

Spring的拦截器与Servlet的Filter有相似之处,比如二者都是AOP编程思想的体现,都能实现权限检查、日志记录等。不同的是:
使用范围不同:Filter是Servlet规范规定的,只能用于Web程序中。而拦截器既可以用于Web程序,也可以用于Application、Swing程序中。
规范不同:Filter是在Servlet规范中定义的,是Servlet容器支持的。而拦截器是在Spring容器内的,是Spring框架支持的。
使用的资源不同:同其他的代码块一样,拦截器也是一个Spring的组件,归Spring管理,配置在Spring文件中,因此能使用Spring里的任何资源、对象,例如Service对象、数据源、事务管理等,通过IoC注入到拦截器即可;而Filter则不能。
深度不同:Filter在只在Servlet前后起作用。而拦截器能够深入到方法前后、异常抛出前后等,因此拦截器的使用具有更大的弹性。所以在Spring构架的程序中,要优先使用拦截器。

 

 

拦截器和过滤器的执行顺序

 

多个Filter顺序如何设定

方式一

多个filter默认使用filter名称进行排序,也就是类名的首个字母顺序,最简单的办法就是巧妙设置类名就可以指定顺序。

根据出处:
https://blog.csdn.net/xie19900123/article/details/82082774

 

方式二

如何设置filter顺序,最好是用FilterRegistrationBean(注解@Order(1)这类方式是没有用的,可能跟版本有关)

具体顺序指定代码如下:

@SpringBootApplication
@MapperScan("com.haizhi.mapper")
@ServletComponentScan
public class DemoApplication extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(DemoApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Bean
    public FilterRegistrationBean registrationFilterBean(){
        FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new Logfilter());
        filterRegistrationBean.addUrlPatterns("/hello/*");
        filterRegistrationBean.setOrder(0);
        filterRegistrationBean.setEnabled(true);
        return filterRegistrationBean;
    }
    
    @Bean
    public FilterRegistrationBean registrationBean() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new Sessionfilter());
        filterRegistrationBean.addUrlPatterns("/hello/*");
        filterRegistrationBean.setOrder(1);
        filterRegistrationBean.setEnabled(true);
        return filterRegistrationBean;
    }
        
}

 

posted @ 2018-12-04 00:36  狂奔的骆驼  阅读(7415)  评论(0编辑  收藏  举报