javaWeb开发之拦截器和过滤器的区别
拦截器和过滤的关系图
拦截器和过滤器简要区别
1、拦截器是基于java的反射机制的,而过滤器是基于函数回调。
2、拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
6、拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
拦截器和过滤器的详细区别
拦截器和过滤器的权威区别
根据《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; } }
技术不在于多么高超先进巧妙,而在于要有现实价值!!!