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

作者:zhangzengxiu 时间:2021-12-17 03:40:41 

流程图

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

* vs过滤器

* 是SpringMVC的技术

过滤器的Servlet的技术

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

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

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

区别

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

SpringMVC技术架构图

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

项目Demo

项目地址

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

依赖

<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 = &ldquo;TestFilter1&rdquo;, urlPatterns = &ldquo;/*&rdquo;)

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

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

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

来源:https://blog.csdn.net/zhangzengxiu/article/details/124357436

标签:Java, , ,过滤器
0
投稿

猜你喜欢

  • 解决AndroidStudio无法运行java中的mian方法问题

    2021-06-17 02:57:32
  • C#动态编译并执行字符串样例

    2022-02-10 22:26:53
  • Java毕业设计实战之校园一卡通系统的实现

    2022-11-26 06:32:56
  • Android开发之自动朗读TTS用法分析

    2021-08-21 22:31:00
  • 初识MyBatis及基本配置和执行

    2021-11-12 05:53:40
  • MyBatis-Plus实现逻辑删除的示例代码

    2022-05-14 06:12:35
  • C++实现LeetCode(169.求大多数)

    2023-09-04 08:03:47
  • 关于Java8新特性Optional类的详细解读

    2023-12-06 00:38:53
  • android使用Path绘制出多边形

    2021-11-11 19:53:38
  • 理解zookeeper选举机制

    2023-04-15 20:09:44
  • Android网络数据开关用法简单示例

    2021-07-20 00:06:06
  • C++形参与实参的区别实例解析

    2023-11-02 23:39:05
  • 剖析Java中线程编程的概念

    2022-02-02 04:12:51
  • Java分布式事务管理框架之Seata

    2023-09-28 11:50:36
  • Springboot+WebSocket实现一对一聊天和公告的示例代码

    2022-06-16 11:32:33
  • Android Fragment概述及用法

    2022-08-23 15:54:22
  • 一文了解自定义MVC框架实现

    2023-01-11 00:15:10
  • 基于OpenCv与JVM实现加载保存图像功能(JAVA 图像处理)

    2021-12-27 23:09:33
  • java多线程加锁以及Condition类的使用实例解析

    2023-08-07 07:25:30
  • Flutter手机权限检查与申请实现方法详解

    2022-01-15 23:52:38
  • asp之家 软件编程 m.aspxhome.com