it编程 > 编程语言 > Java

Spring Boot中拦截器与过滤器的使用场景和区别详解

14人参与 2026-08-03 Java

拦截器与过滤器的区别

1、过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。

如下图:


2、拦截器可以获取ioc容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并管理的,spring的功能可以被拦截器使用,在拦截器里注入一个service,可以调用业务逻辑。而过滤器是javaee标准,只需依赖servlet api ,不需要依赖spring。

过滤器拦截器运行先后步骤:

其中第2步,springmvc的机制是由dispaterservlet来分发请求给不同的controller,其实这一步是在servlet的service()方法中执行的.

3、过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射,代理分静态代理和动态代理,动态代理是拦截器的简单实现。

何时使用拦截器?何时使用过滤器?

spring boot 使用过滤器

两种方式:

1、使用spring boot提供的filterregistrationbean注册filter

2、使用原生servlet注解定义filter

两种方式的本质都是一样的,都是去filterregistrationbean注册自定义filter

方式一

①、先定义filter:

package com.hwm.filter;
import javax.servlet.*;
import java.io.ioexception;
public class myfilter implements filter {
    @override
    public void init(filterconfig filterconfig) throws servletexception {
    }
    @override
    public void dofilter(servletrequest servletrequest, servletresponse servletresponse, filterchain filterchain) throws ioexception, servletexception {
        // do something 处理request 或response
        system.out.println("filter1");
        // 调用filter链中的下一个filter
        filterchain.dofilter(servletrequest,servletresponse);
    }
    @override
    public void destroy() {
    }
}

②、注册自定义filter

@configuration
public class filterconfig {
    @bean
    public filterregistrationbean registrationbean() {
        filterregistrationbean filterregistrationbean = new filterregistrationbean(new myfilter());
        filterregistrationbean.addurlpatterns("/*");
        return filterregistrationbean;
    }
}

方式二

// 注入spring容器
@component
// 定义filtername 和过滤的url
@webfilter(filtername = "my2filter" ,urlpatterns = "/*")
public class my2filter implements filter {
    @override
    public void init(filterconfig filterconfig) throws servletexception {
    }
    @override
    public void dofilter(servletrequest servletrequest, servletresponse servletresponse, filterchain filterchain) throws ioexception, servletexception {
        system.out.println("filter2");
    }
    @override
    public void destroy() {
    }
}

spring boot拦截器的使用

①、定义拦截器:

public class myinterceptor implements handlerinterceptor {
    @override
    public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception {
        system.out.println("prehandle");
        return true;
    }
    @override
    public void posthandle(httpservletrequest request, httpservletresponse response, object handler, @nullable modelandview modelandview) throws exception {
        system.out.println("posthandle");
    }
    @override
    public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, @nullable exception ex) throws exception {
        system.out.println("aftercompletion");
    }
}

②、配置拦截器:

@configuration
public class interceptorconfig implements webmvcconfigurer {
    @override
    public void addinterceptors(interceptorregistry registry) {
        registry.addinterceptor(new myinterceptor());
    }
}

③controller演示:

@restcontroller
public class ucontroller {
    @getmapping("/home")
    public string home(){
        system.out.println("home");
        return "myhome";
    }## 标题 ##
}

输出:

prehandle
home
posthandle
aftercompletion

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

您想发表意见!!点此发布评论

推荐阅读

Spring定时任务@Scheduled cron原理与实现详解

08-03

SpringBoot集成OnlyOffice实现Word/Excel在线编辑功能

08-03

SpringBoot拦截器怎么用?从入门到多拦截器链式调用详解

08-03

Java集合框架常用API有哪些?List、Set、Map方法大全

08-03

SpringBoot接口参数接收指南:从URL到请求体,4种方式一次掌握

08-03

java运行排错,新码旧jar问题及解决

08-03

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论