Spring中过滤器(Filter)和拦截器(Interceptor)的区别和联系解析

 更新时间:2022年10月27日 08:22:19   作者:hardyzhou  
在我们日常的开发中,我们经常会用到Filter和Interceptor,这篇文章主要介绍了Spring中过滤器(Filter)和拦截器(Interceptor)的区别和联系 ,需要的朋友可以参考下

在我们日常的开发中,我们经常会用到Filter和Interceptor。有时同一个功能。Filter可以做,Interceptor也可以做。有时就需要考虑使用哪一个比较好。这篇文章主要介绍一下,二者的区别和联系。希望给大家进行选择的时候,提供一些帮助

Filter 和 Interceptor 的区别

Filter

过滤器(Filter)是在请求进入Tomcat容器之后,请求进入Servlet之前执行。Filter是Servlet规范规定的,只能用于web程序中。

Interceptor

拦截器(Interceptor)是在Servlet和Controller控制器之间执行。Interceptor是SpringframeWork中规定的。

  • Interceptor是基于java的反射机制的,而Filter是基于函数回调。
  • Interceptor不依赖与servlet容器,Filter依赖与servlet容器。
  • Interceptor只能对action请求起作用,而Filter则可以对几乎所有的请求起作用。
  • Interceptor可以访问action上下文、值栈里的对象,而Filter不能访问。
  • Interceptor以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。拦截器可以获取ioc中的service bean实现业务逻辑。

Spring MVC中每个控制器中可以定义多个请求处理方法,我们把这种请求处理方法简称为Action

Filter的实现

自己的filter需要要实现javax.servlet.Filter.

import javax.servlet.*;
import java.io.IOException;

public class Myfilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Myfilter init");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Myfilter doFilter before");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("Myfilter doFilter after");
    }

    @Override
    public void destroy() {
        System.out.println("Myfilter destroy");
    }
}

注册Filter在web.xml中

<!-- 注册过滤器 -->
    <filter>
        <filter-name>myfilter</filter-name>
        <filter-class>com.hardy.config.Myfilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>myfilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

Interceptor的实现

自己的Interceptor需要要实现org.springframework.web.servlet.HandlerInterceptor.

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在拦截点(Controller方法处理之前)执行拦截 若返回的是false则中断执行 反之亦然
        System.out.println("MyInterceptor preHandle");
        return HandlerInterceptor.super.preHandle(request, response, handler);
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 在处理过程中(Controller方法处理完之后  DispatcherServlet进行视图的渲染之前)执行拦截
        System.out.println("MyInterceptor postHandle");
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 在DispatcherServlet进行视图的渲染后 返回前进行拦截
        System.out.println("MyInterceptor afterCompletion");
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}

注册Interceptor在spring的配置文件中(application.xml)

    <!-- 配置拦截器 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- 拦截所有的mvc控制器(Controller) -->
            <mvc:mapping path="/**"/>
            <!-- 放行机制 指定对某个页面不进行拦截 -->
            <!-- 拦截器只对action起作用 因此填入的不是页面路径 而是方法 -->
            <mvc:exclude-mapping path="/login"/>
            <!-- 指定使用哪个拦截器 -->
            <bean class="com.hardy.config.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

到此这篇关于Spring中过滤器(Filter)和拦截器(Interceptor)的区别和联系的文章就介绍到这了,更多相关Spring过滤器和拦截器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JProfiler11使用教程之JVM调优问题小结

    JProfiler11使用教程之JVM调优问题小结

    这篇文章主要介绍了JProfiler11使用教程之JVM调优,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • java使用lambda表达式对List集合进行操作技巧(JDK1.8)

    java使用lambda表达式对List集合进行操作技巧(JDK1.8)

    这篇文章主要介绍了java使用lambda表达式对List集合进行操作技巧适用jdk1.8,感兴趣的朋友跟着小编一起看看实现代码吧
    2018-06-06
  • Java实现MD5加密算法方法例子

    Java实现MD5加密算法方法例子

    这篇文章主要给大家介绍了关于Java实现MD5加密算法方法的相关资料,MD5加密是一种常见的加密方式,我们经常用在保存用户密码和关键信息上,需要的朋友可以参考下
    2023-10-10
  • springAOP完整实现过程

    springAOP完整实现过程

    当你调用SimpleService类的doSomething方法时,上述的PerformanceAspect会自动拦截此调用,并且记录该方法的执行时间,这样你就完成了一个针对Spring的AOP入门级案例,感兴趣的朋友一起看看吧
    2024-02-02
  • Java使用跳转结构实现队列和栈流程详解

    Java使用跳转结构实现队列和栈流程详解

    这篇文章主要介绍了Java使用跳转结构实现队列和栈流程,连续结构和跳转结构是数据结构中常见的两种基本数据结构,而我们本次的主角栈和队列都 既可以使用使用跳转结构实现也可以使用连续结构实现
    2023-04-04
  • druid ParserException类错误问题及解决

    druid ParserException类错误问题及解决

    这篇文章主要介绍了druid ParserException类错误问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java实现经典游戏打砖块游戏的示例代码

    Java实现经典游戏打砖块游戏的示例代码

    这篇文章主要介绍了如何利用Java实现经典的游戏—打砖块。玩家操作一根萤幕上水平的“棒子”,让一颗不断弹来弹去的“球”在撞击作为过关目标消去的“砖块”的途中不会落到萤幕底下。感兴趣的小伙伴可以了解一下
    2022-02-02
  • Java8 List集合如何移除满足条件的元素

    Java8 List集合如何移除满足条件的元素

    这篇文章主要介绍了Java8 List集合如何移除满足条件的元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • SpringBoot 分布式验证码登录方案示例详解

    SpringBoot 分布式验证码登录方案示例详解

    为了防止验证系统被暴力破解,很多系统都增加了验证码效验,比较常见的就是图片二维码,业内比较安全的是短信验证码,当然还有一些拼图验证码,加入人工智能的二维码等等,我们今天的主题就是前后端分离的图片二维码登录方案,感兴趣的朋友一起看看吧
    2023-10-10
  • Java超详细讲解排序二叉树

    Java超详细讲解排序二叉树

    排序二叉树的特点是一个父节点只能有左右两个子节点、左节点的值比父节点要小、右节点的值要比父节点要大,难度并不大,但是得花时间来理解
    2022-06-06

最新评论