首页 > 编程知识 正文

过滤器和拦截器哪个先执行(javaweb过滤器和拦截器)

时间:2023-05-04 13:41:19 阅读:66761 作者:1643

过滤器详解

使用依赖于servlet容器,实现基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。过滤器的目的是进行一些过滤操作,获取我们想要获取的数据。 过滤器通常用于验证登录权限、控制资源访问权限、过滤敏感术语、转换字符代码等操作,便于代码重用,无需对每个servlet执行冗馀操作。

Java过滤器不是标准servlet,不能处理用户请求或响应客户端。 主要用于HttpServletRequest的预处理,也用于HttpServletResponse的后处理。 是典型的处理链。 完整的过程是,Filter预处理用户请求,将请求传递给servlet进行处理,生成响应,最后Filter后处理服务器响应。 在http servlet到达servlet之前,阻止客户对http servlet的请求。 如果需要,还可以检查HttpServletRequest以更改HttpServletRequest标头和数据。 在响应到达客户端之前阻止http servlet的响应。 如果需要,可以检查http servlet资源并修改http servlet标头和数据。

过滤器将在web APP应用程序启动时启动,仅初始化一次,并在web APP应用程序停止时销毁。

1 .在服务器启动时加载筛选器实例(init ) )调用方法初始化实例

2 .每次请求只调用方法doFilter ) )进行处理;

3 .停止服务器时调用destroy (方法并销毁实例。

过滤器链处理:

来自浏览器的请求传递给第一个过滤器进行过滤,如果符合规则则释放,传递给过滤器链中的下一个过滤器进行过滤。过滤器在链中的顺序与它在web.xml中配置的顺序有关,前面配置的在链条前端。 请求通过链中的所有过滤器后,即可访问资源文件,如果无法通过,则可能由中间过滤器处理。 在web.xml中设置过滤器。 在此,请注意侦听器过滤器的servlet原则

在doFilter ()方法中,chain.doFilter ) )之前是通常对request执行的过滤操作,而chain.doFilter之后的代码是通常对response执行的操作。 过滤器链代码的执行顺序如下。

拦截器详解

依赖于web框架,在SpringMVC中依赖于SpringMVC框架。在实现上基于Java的反射机制是面向片层编程(AOP )的一种运用。 拦截器是基于web框架的调用,因此拦截器可以调用IOC容器中的各种依赖,而过滤器不能,因此可以使用Spring的依赖注入进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。

spring mvc的拦截器可以理解为spring mvc框架在AOP中的实现方式。 一般的简单功能又很通用,必须按要求处理。 例如,判断token失效后是否可以使用spring mvc的HanlderInterceptor,缓存等复杂的东西使用spring aop。 服务层一般多使用spring aop,控制器层在需要使用请求和响应时可以使用拦截器。

spring mvc的拦截器拦截请求是通过处理程序拦截器实现的。 因此,HandlerInteceptor拦截器仅在Spring Web MVC环境中可用。在SpringMVC中定义一个拦截器主要有两种方式,第一种方式是要实现Spring的HandlerInterceptor接口,或者是其它实现了HandlerInterceptor接口的类,比如HandlerInterceptorAdapter。第二种方式是实现WebRequestInterceptor接口,或者其它实现了WebRequestInterceptor的类。

如何定义HandlerInterceptor接口preHandle、postHandle和afterCompletion :

pre handle (在进入handler方法之前执行) :预处理回调方法提供处理器预处理,如登录检查。 返回值:true表示下一个拦截器和处理器调用等进程的继续,false表示登录检查失败等进程的中断,其他拦截器和处理器的调用不继续。 在这种情况下,必须通过响应

posthandle (进入handler方法后返回modelAndView前) :后处理回调方法,实现位置

理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。
afterCompletion(执行Handler完成执行此方法):整个请求处理完毕回调方法,即在视图渲染完毕时回调。该方法也是需要当前对应的Interceptor 的preHandle方法的返回值为true时才会执行。这个方法的主要作用是用于进行资源清理工作的,如性能监控中我们可以在此记录结束时间并输出消耗时间。

以HandlerInterceptor1、HandlerInterceptor2为例,解析拦截器执行顺序
第一种情况:正常的拦截器执行流程

第二种情况:非正常情况下的拦截器(拦截器1放行,拦截器2拦截)
HandlerInterceptor1...preHandle
HandlerInterceptor2...preHandle
HandlerInterceptor1...afterCompletion

总结:
拦截器1放行,拦截器2 preHandle才会执行。
拦截器2 preHandle不放行,拦截器2 postHandle和afterCompletion不会执行。
只要有一个拦截器不放行,postHandle不会执行。

第三种情况:非正常情况下的拦截器(拦截器1拦截,拦截器2拦截)
HandlerInterceptor1...preHandle
总结:
拦截器1 preHandle不放行,postHandle和afterCompletion不会执行。
拦截器1 preHandle不放行,拦截器2不执行。

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

Filter和HandlerInterceptor的执行顺序

===========before doFilter1
===========before doFilter2
===========HandlerInterceptorAll preHandle
===========HandlerInterceptor1 preHandle
===========HandlerInterceptor2 preHandle
执行Controller
Controller return前
===========HandlerInterceptor2 postHandle
===========HandlerInterceptor1 postHandle
===========HandlerInterceptorAll preHandle
Controller return后,视图加载完成
===========HandlerInterceptor2 afterCompletion
===========HandlerInterceptor1 afterCompletion
===========HandlerInterceptorAll preHandle
===========before doFilter2
===========before doFilter1



 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。