简介
- 过滤器
依赖于servlet容器
。在实现上基于函数回调
,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等 - 拦截器
依赖于web框架
,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。 - 过滤器拦截器运行先后步骤
springBoot使用过滤器
方法一 :使用FilterRegistrationBean ,这种方式过滤器中可以注入bean(前提setFilter 传容器的bean,不是传new的形式)
方法二:在过滤器上使用@WebFilter注解 需要在启动类加@ServletComponentScan(basePackages="需要扫描的包")
使用@ServletComponentScan注解后 Servlet可以直接通过@WebServlet
注解自动注册
Filter可以直接通过@WebFilter
注解自动注册,Listener可以直接通过@WebListener 注解自动注册
方法三:直接在过滤器上使用@Component注解(纳入容器管理) 这种方式可以注入bean
注:方法二方式在部署到tomcat的时候即war部署(idea 内置的没这种问题 即jar部署 java -jar xxx.war也没问题)过滤器中不能注入bean,注入bean则会空指针异常
springBoot使用拦截器
注:1)过滤器和拦截器设置的时候filterRegistrationBean.setFilter(x)和registry.addInterceptor(x).addPathPatterns("/**")中的x 都可以用new 的形式,但是这样拦截器和过滤器中注入的bean就会失败,始终为null,当x为容器的bean则能解决过滤器和拦截器中无法注入bean的问题。
2)全局异常可以捕获拦截器里的异常,而不能捕获过滤器里的异常!