首页 > 其他分享 >spring boot 过滤器、拦截器的区别和使用

spring boot 过滤器、拦截器的区别和使用

时间:2023-04-24 15:47:52浏览次数:29  
标签:拦截器 spring void boot 过滤器 FilterRegistrationBean Override public

区别:

一、过滤器与拦截器的对比

1.使用范围不同:过滤器是基于Servlet,而拦截器是基于Spring的,Spring框架底层又离不开Servlet,所以过滤器也能在Spring体系中使用。
2.使用资源不同:拦截器有Spring的支持,能够方便的向容器中注册对象和使用对象,但是过滤器就不能。
3.使用场景不同:灵活性上说拦截器功能更强大些,Filter能做的事情,他都能做,Filter主要是针对URL地址做一个编码、过滤掉没用的参数、安全校验等,要是处理些繁杂的业务逻辑,还是建议用拦截器方便注册和使用容器中的对象。
4.实现方式不同:过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射。
5.拦截范围:过滤器几乎可以对所有请求起作用,而拦截器只会对Controller中请求或访问static目录下的资源请求起作用。(因为拦截器内部是JDK动态代理实现的,拦截的对象只能是实现了接口的对象,而不能拦截url这种链接)

 

动态代理的方式有两种:
JDK动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
CGLIB动态代理:利用ASM(开源的Java字节码编辑库,操作字节码)开源包,将代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
区别:JDK代理只能对实现接口的类生成代理;CGlib是针对类实现代理,对指定的类生成一个子类,并覆盖其中的方法,这种通过继承类的实现方式,不能代理final修饰的类。

 

二、监听器

监听器是一种Servlet特殊类,它们能帮助开发者监听Web中特定的事件,比如ServletContext、HttpSession、ServletRequest等对象的创建和销毁,在某些动作前后增加处理,实现监控。
监听器的使用场景很多,比如监听ServletContext用来初始化一些数据、监听HttpSession用来获取当前在线的人数、监听ServletRequest对象来获取用户的访问信息等。

 

 使用:

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;
    }
}

 

方式二:

@Order(1)
// 注入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() { } }

order定义filter的优先级,值越小优先级越高,因此运行顺序为

filter3—doFilter—>filter2—doFilter—>filter1—doFilter—>控制器方法—>返回到filter1—>返回到filter2—>返回到filter3

 

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";
    }
}

 

 

三个器写好,配置到一块

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    MyInterceptor myInterceptor;

    /**
     * 注册拦截器
     * @return
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor);
    }

    /**
     * 注册过滤器
     * @return
     */
    @Bean
    public FilterRegistrationBean filterRegistrationBean(){
        FilterRegistrationBean filterRegistration = new FilterRegistrationBean();
        filterRegistration.setFilter(new MyFilter());
        filterRegistration.addUrlPatterns("/*");
        return filterRegistration;
    }

    /**
     * 注册监听器
     * @return
     */
    @Bean
    public ServletListenerRegistrationBean registrationBean(){
        ServletListenerRegistrationBean registrationBean = new ServletListenerRegistrationBean();
        registrationBean.setListener(new MyHttpRequestListener());
        registrationBean.setListener(new MyHttpSessionListener());
        return registrationBean;
    }
}

 

 

 

转 : https://blog.csdn.net/heweimingming/article/details/79993591

https://www.cnblogs.com/haixiang/p/12000685.html

https://www.cnblogs.com/dayu123/p/16486482.html

https://blog.csdn.net/zth13015409853/article/details/126404344

https://blog.csdn.net/cristianoxm/article/details/119735912

https://www.cnblogs.com/hanliukui/p/13198173.html

 

标签:拦截器,spring,void,boot,过滤器,FilterRegistrationBean,Override,public
From: https://www.cnblogs.com/fps2tao/p/17349553.html

相关文章

  • Springboot将自定义jar包引入pom
    Springboot将自定义jar包引入pom Springboot将自定义jar包引入pom <dependency><groupId>TrendDB_API</groupId><artifactId>TrendDB_API</artifactId><version>1.0</version>......
  • springboot项目配置多个kafka
    1.spring-kafka<dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><version>1.3.5.RELEASE</version></dependency>2.配置文件相关信息kafka.bootstrap-servers=local......
  • 一文详解RocketMQ-Spring的源码解析与实战
    摘要:这篇文章主要介绍SpringBoot项目使用rocketmq-springSDK实现消息收发的操作流程,同时笔者会从开发者的角度解读SDK的设计逻辑。本文分享自华为云社区《RocketMQ-Spring:实战与源码解析一网打尽》,作者:勇哥java实战分享。RocketMQ是大家耳熟能详的消息队列,开源项目......
  • springboot集成redis时总报错Connection refused: no further information: localhost
    nacos上配置的关于redis的key值不是springboot需要的固定写法如:sping.redis.host=spring.redis.port=sping.redis.password=spring.redis.database=我写的是一个自定义的key如com.dream.redis.host改为springboot认识的即可其他和springboot集成的组件类似,切记......
  • 关于爬虫中所用到的请求拦截器和响应拦截器
    1、首先我们看一下,axios的发包axios=require('axios')//导入axios包//用axios发包,then回来的来处理服务器返回的数据(响应头)//then是axios接收后台返回数据的vuejquery//success是的接收后台返回数据ajaxaxios.get('http://httpbin.org/get').then(fun......
  • 分析需要修改的地方与SpringSecurity完整流程
    分析需要修改的地方 原理初探​想要知道如何实现自己的登陆流程就必须要先知道入门案例中SpringSecurity的流程。SpringSecurity完整流程SpringSecurity完整流程SpringSecurity的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤......
  • SpringSecurity从入门到精通:如何查看具体的过滤器&入门案例认证流程图讲解
    如何查看具体的过滤器  入门案例认证流程图讲解 概念速查:Authentication接口:它的实现类,表示当前访问系统的用户,封装了用户相关信息AuthenticationManager接口:定义了认证Authentication的方法UserDetailsService接口:加载用户特定数据的核心接口,里面定义了......
  • Spring Security从入门到精通:入门案例准备工作&入门案例引入Spring Secuirity
    入门案例准备工作我们先要搭建一个简单的SpringBoot工程设置父工程添加依赖<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.0</version><......
  • SpringMVC 框架总结笔记
    第一章初识SpringMVC1.1SpringMVC概述SpringMVC是Spring子框架SpringMVC是Spring为【展现层|表示层|表述层|控制层】提供的基于MVC设计理念的优秀的Web框架,是目前最主流的MVC框架。SpringMVC是非侵入式:可以使用注解让普通java对象,作为请求处理器【Controller】......
  • SpringSecurity从入门到精通:简介
    SpringSecurity从入门到精通:简介SpringSecurity是Spring家族中的一个安全管理框架,想比另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富一般来说中大型的项目都是使用SpringSecurity来做安全框架,小项目有Shiro的比较多,因为想比与SpringSecurity,Shiro的......