Filter(过滤器)与Interceptor(拦截器)的区别
区别
①拦截器interceptor是基于Java的反射机制的,而过滤器Filter是基于函数回调,实现的filter接口中doFilter方法就是回调函数。
②拦截器interceptor不依赖于servlet容器,过滤器Filter依赖于servlet容器,没有servlet容器就无法来回调doFilter方法。
③拦截器interceptor只能对action请求起作用,而过滤器Filter则可以对几乎所有的请求起作用,Filter的过滤范围比Interceptor大,Filter除了过滤请求外通过通配符可以保护页面,图片,文件等等。
④拦截器interceptor可以访问action上下文、值栈里的对象,而过滤器Filter不能访问。
⑤在action的生命周期中,拦截器interceptor可以多次被调用,而过滤器Filter只能在容器初始化时被调用一次。
⑥拦截器interceptor可以获取IOC容器中的各个bean,而过滤器Filter就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
知识点补充:JAVA反射机制
JAVA反射机制——是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象的功能称为~~~~~~。
JAVA反射机制主要提供以下的功能:
①、在运行时判断任意一个对象所属的类
②、在运行时构造任意一个类的对象
③、在运行时判断任意一个类所具有的成员变量和方法
④、在运行时调用任意一个对象的方法
⑤、生成动态代理
自定义拦截器
Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口
–preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求request进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。
–postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet向客户端返回响应前被调用,在该方法中对用户请求request进行处理。
–afterCompletion():这个方法在DispatcherServlet完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。
步骤:
第一步:创建一个类,实现HandlerInterceptor接口
第二步:在springmvc配置文件里面添加配置