一文详解Java拦截器与过滤器的使用

 更新时间:2022年04月26日 15:44:40   作者:zhangzengxiu  
这篇文章主要为大家详细介绍了Java中拦截器与过滤器的使用与区别,文中的示例代码讲解详细,对我们学习有一定参考价值,需要的可以参考一下

流程图

拦截器vs过滤器

拦截器是SpringMVC的技术

过滤器的Servlet的技术

先过过滤器,过滤器过完才到DispatcherServlet;

拦截器归属于SpringMVC,只可能拦SpringMVC的东西;

拦截器说白了就是为了增强,可以在请求前进行增强,也可以在请求后进行增强,但是不一定同时在前后都增强。

区别

SpringMVC技术架构图

项目Demo

项目地址

依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.7.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

Interceptor拦截器

package com.test.filtertest.inter;

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

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

/**
 * 拦截器
 *
 * @author: zhangzengxiu
 * @createDate: 2022/4/22
 */
@Component
public class TestInter1 implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("TestInter1 preHandle...");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("TestInter1 postHandle...");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("TestInter1 afterCompletion...");
    }
}

Interceptor拦截器要注册

package com.test.filtertest.config;

import com.test.filtertest.inter.TestInter1;
import com.test.filtertest.inter.TestInter2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @author zhangzengxiu
 * @date 2022/4/22
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private TestInter1 testInter1;

    @Autowired
    private TestInter2 testInter2;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //默认/** 拦截所有请求
        registry.addInterceptor(testInter1).addPathPatterns("/**");
        registry.addInterceptor(testInter2);
    }
}

拦截顺序

多拦截器拦截顺序取决于registry的注册顺序

Filter过滤器

1、多Filter不指定过滤顺序

package com.test.filtertest.filter;

import org.springframework.core.annotation.Order;

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

/**
 * @author zhangzengxiu
 * @date 2022/4/22
 */
@WebFilter(filterName = "TestFilter1", urlPatterns = "/*")
//@Order(2) //filter这样定义拦截顺序无效,还是会按照类名去拦截
public class TestFilter1 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("TestFilter1 filter before ...");
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("TestFilter1 filter after ...");
    }

    @Override
    public void destroy() {

    }
}

加了@WebFilter注解的过滤器要生效,需要在启动类上加一个注解@ServletComponentScan

2、多Filter指定过滤顺序

如果要设置过滤顺序的话,在Filter上添加@Order 不会生效,还是会默认根据Filter过滤器的类名去进行过滤。

如果想要指定拦截顺序,需要添加一个配置类,通过设置Order的值去设置过滤顺序,Order数值越小优先级越高

package com.test.config;

import com.test.filter.TestFilter1;
import com.test.filter.TestFilter2;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;

/**
 * filter过滤器配置
 *
 * @author: zhangzengxiu
 * @createDate: 2022/4/24
 */
@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean testFilter1() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        Filter testFilter1 = new TestFilter1();
        filterRegistrationBean.setFilter(testFilter1);
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.setName("testFilter1");
        filterRegistrationBean.setOrder(2);//指定过滤顺序,数值越小优先级越高
        return filterRegistrationBean;
    }

    @Bean
    public FilterRegistrationBean testFilter2() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        Filter testFilter2 = new TestFilter2();
        filterRegistrationBean.setFilter(testFilter2);
        filterRegistrationBean.setName("testFilter2");
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.setOrder(1);//指定过滤顺序,数值越小优先级越高
        return filterRegistrationBean;
    }
}

1、同时原本Filter过滤器上的@WebFilter(filterName = “TestFilter1”, urlPatterns = “/*”)

这个注解最好去掉,否则bean重复会报错,要么bean名称不要重复,换个名称。但是不去掉的话@ServletComponentScan也要被保留,最好统一格式,只使用config配置。

2、启动类上的@ServletComponentScan 注解也不需要了,可以去掉了,因为不用扫描@WebFilter注解了。但是如果@WebFilter还保留了,那么就不能去掉了。不然加了@WebFilter的过滤器就不会生效了,因为没扫到。

到此这篇关于一文详解Java拦截器与过滤器的使用的文章就介绍到这了,更多相关Java拦截器 过滤器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于maven本地仓库的配置方式

    关于maven本地仓库的配置方式

    这篇文章主要介绍了关于maven本地仓库的配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Spring中@Controller和@RestController的区别详解

    Spring中@Controller和@RestController的区别详解

    这篇文章主要介绍了Spring中@Controller和@RestController的区别详解,@RestController 是 @Controller 和 @ResponseBody 的结合体,单独使用 @RestController 的效果与 @Controller 和 @ResponseBody 二者同时使用的效果相同,需要的朋友可以参考下
    2023-10-10
  • 自己动手实现mybatis动态sql的方法

    自己动手实现mybatis动态sql的方法

    下面小编就为大家分享一篇自己动手实现mybatis动态sql的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • 解决SpringBoot配置文件项目重启出现乱码的问题

    解决SpringBoot配置文件项目重启出现乱码的问题

    最近在创建了SpringBoot项目后往配置文件中写了相关的系统配置,并且在上面加了中文注释,但是在重启项目或开机重启后遇到了注释乱码的情况,下面这篇文章主要给大家介绍一下如何解决SpringBoot配置文件项目重启出现乱码的问题,需要的朋友可以参考下
    2023-06-06
  • springboot logback调整mybatis日志级别无效的解决

    springboot logback调整mybatis日志级别无效的解决

    这篇文章主要介绍了springboot logback调整mybatis日志级别无效的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 一篇文章带你入门Java之编程规范

    一篇文章带你入门Java之编程规范

    这篇文章主要介绍了如何养成良好java代码编码规范,规范需要平时编码过程中注意,是一个慢慢养成的好习惯,下面小编就带大家来一起详细了解一下吧
    2021-08-08
  • 如何在Java中优雅地使用正则表达式详解

    如何在Java中优雅地使用正则表达式详解

    这篇文章主要给大家介绍了关于如何在Java中优雅地使用正则表达式的相关资料,正则表达式就是一个字符串,但和普通的字符串不同的是,正则表达式是对一组相似字符串的抽象,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-02-02
  • java如何获取10位和13位时间戳

    java如何获取10位和13位时间戳

    这篇文章主要介绍了java如何获取10位和13位时间戳问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Spring中利用IOC实现注入的方式

    Spring中利用IOC实现注入的方式

    Spring IOC(控制反转)实现依赖注入,将对象创建和依赖关系的管理交由Spring容器处理,通过注解或XML配置,实现对象之间的松耦合,提高代码复用性和可维护性
    2023-04-04
  • Scala入门教程详解

    Scala入门教程详解

    这篇文章主要介绍了Scala入门教程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06

最新评论