拦截器(Interceptor)和过滤器(Filter)

Interceptor

简介:

它依赖于web框架,基于Java的反射机制,属于面向切面编程(AOP)的一种运用,就是在service或者一个方法前,调用一个方法,或者在方法后,调用一个方法,动态代理就是拦截器的简单实现
在SpringMVC中使用它可以实现HandlerInterceptor接口

public interface HandlerInterceptor {
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }

    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }

    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}
  • preHandle :该方法将在请求处理之前进行调用。SpringMVC 中的Interceptor 是链式的调用的,在一个请求中可以同时存在多个Interceptor 。每个Interceptor 的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor 中的preHandle 方法,该方法的返回值是布尔值Boolean类型的,当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会再执行;当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法,如果已经是最后一个Interceptor 的时候就会是调用当前请求的Controller 方法。

  • postHandle : 在当前所属的Interceptor 的preHandle 方法的返回值为true 时才能被调用。当前请求进行处理之后,也就是Controller 方法调用之后执行,但是它会在DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。postHandle 方法被调用的方向跟preHandle 是相反的,也就是说先声明的Interceptor 的postHandle 方法反而会后执行。

  • afterCompletion:该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。

Filter

简介:

它依赖于servlet容器。它可以对几乎所有请求进行过滤,基于函数回调,一个过滤器实例只能在容器初始化时调用一次。使用过滤器是用来做一些过滤操作,例如:对request、response进行过滤。
想要使用它可以实现Filter接口

public interface Filter {
    void init(FilterConfig var1) throws ServletException;

    void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;

    void destroy();
}
  • void init(FilterConfig var1):用于完成Filter的初始化。
  • void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) :实现过滤功能。该方法可以实现对用户请求进行预处理,也可实现对服务器响应进行后处理,它们的分界线为是否调用了chain.doFilter(),执行该方法之前,即对用户请求进行预处理;执行该方法之后,即对服务器响应进行后处理。
  • void destory():用于Filter销毁前,完成某些资源的回收。
区别
  • Filter在只在 Servlet 前后起作用,拦截器能够深入到方法前后、异常抛出前后等,因此拦截器的使用具有更大的弹性。几乎所有 Filter 能够做的事情, interceptor 都能够轻松的实现。
  • Filter 是在 Servlet 规范中定义的,是 Servlet 容器支持的。而拦截器是在 Spring容器内的,是Spring框架支持的。
执行顺序

doFilter之前-preHandle-controller处理-postHandle-view渲染-afterCompletion-doFilter之后

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值