首页 > 其他分享 >Spring中过滤器(Filter)和拦截器(Interceptor)的区别和联系

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

时间:2022-10-26 22:25:03浏览次数:49  
标签:拦截器 Spring System Filter println Interceptor servlet public

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

Filter 和 Interceptor 的区别

Filter

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

Interceptor

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

image

  • 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,System,Filter,println,Interceptor,servlet,public
From: https://www.cnblogs.com/hardyzhou/p/16830294.html

相关文章

  • 【开发者测试-2】Mockito、Spring-Test
    MockitoPOM依赖<dependency><groupId>org.mockito</groupId><artifactId>mockito-all</artifactId><version>1.10.19</version><scope>test</scope......
  • Spring Aop的学习(一):Spring Aop的简单入门
    1.什么是AOPAOP(AspectOrientedProgramming):面向切面编程,是OOP(面向对象编程)的一个延续,其和OOP一样,也是一种编程思想。不过AOP是一种横向开发模式。2.AOP的作用及......
  • hyperf/go/springboot通过jsonrpc通信
    一、背景随着用户的增长和业务的增多,单节点服务已经满足不了需求,用hyperf对主业务进行了重构。hyperf是一个后现代的php框架,基于php+swoole,支持协程,解决了php让人诟病的......
  • 【spring框架】关于@Autowired与@Resource
    关于@Autowired与@Resource1.@Autowired是先按类型注入,如果存在两个及以上实现按名称注入,名称不存在可以使用@Qualifier指定,否则报错@Autowired@Qualifier("myServiceIm......
  • Springboot和mybatis-plus支持多数据源(多数据库)
    1、pom添加依赖<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.1</version></de......
  • 搭建基本的springboot框架
    <?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"......
  • 15. Spring概述
    一、为什么要使用Spring1.1、OCP开闭原则  OCP是软件七大开发原则当中最基本的一个原则:开闭原则,即对扩展开放、对修改关闭;OCP原则是最核心的,最基本的,其它六个原则都......
  • Spring @Scheduled问题总结
    1.@Scheduled使用在SpringBoot中要想使用@Scheduled注解,先要在启动类上加上注解@EnableScheduling@Configuration@EnableScheduling publicclassScheduleCo......
  • SpringBoot启动过程(二)
    ​​上一篇​​https://blog.51cto.com/u_15815563/5787667​​说到设置了初始化器。设置listener现在,同样的一套流程,这次要实例化的是实现了ApplicationListener的类,并存......
  • Springboot 一行代码实现文件上传 20个平台!少写代码到极致
    又是做好人好事的一天,有个小可爱私下问我有没有好用的springboot文件上传工具,这不巧了嘛,正好我私藏了一个好东西,顺便给小伙伴们也分享一下,demo地址放在文末了。文件上传......