zoukankan      html  css  js  c++  java
  • 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;
        }
            
    }
  • 相关阅读:
    block为什么用copy以及如何解决循环引用
    iOS证书失效
    基于AFNetWorking封装一个网络请求数据的类
    Xcode的内存清理
    block的用法以及block和delegate的比较(转发)
    React-Native 获取node.js提供的接口
    npm创建和发布模块
    React-Native之ViewPagerAndroid的使用
    使用.NET框架、Web service实现Android的文件上传(二)
    使用.NET框架、Web service实现Android的文件上传(一)
  • 原文地址:https://www.cnblogs.com/geektcp/p/10061908.html
Copyright © 2011-2022 走看看