Springboot中的过滤器和拦截器

1.自定义一个类实现Filter接口

package com.example.demo.filter;

import jakarta.servlet.*;

import java.io.IOException;


public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setAttribute("username","cao");
        servletRequest.setAttribute("age",22);
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("filter");
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

2.注册我们自定义的Filter

package com.example.demo.config;


import com.example.demo.filter.MyFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean registrationBean() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        return filterRegistrationBean;
    }

}

3.控制层

package com.example.demo.controller;

import com.example.demo.config.HttpResponse;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class FilterController {

    @GetMapping("/filter")
    public HttpResponse getFilter(HttpServletRequest request, HttpServletResponse response){
        String username = (String) request.getAttribute("username");
        System.out.println(username);
        Integer age = (Integer) request.getAttribute("age");
        System.out.println(age);
        return HttpResponse.ok();
    }

}

4.多个过滤器

多个过滤器执行的顺序和在配置文件中配置的顺序是一样的
再自定义一个Filter同时在配置文件中写一下

package com.example.demo.filter;

import jakarta.servlet.*;

import java.io.IOException;

public class MyFilter1 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setAttribute("message","Filter1");
        servletRequest.setAttribute("code",200);
        System.out.println("filter1");
        //filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

@Bean
    public FilterRegistrationBean registrationBean2() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter1());
        filterRegistrationBean.addUrlPatterns("/*");
        return filterRegistrationBean;
    }

我们可以通过setOrder()来控制过滤器执行的顺序
以前我一直理解错了,我认为一个请求过来会将所有的过滤器执行才会去Controller,原来是请求先是被Filter拦截,进行处理后在Controller执行,执行完成后,再执行 filterChain.doFilter(servletRequest,servletResponse)后的内容
那这样的话我就能记录一个请求的执行时间了

long start = System.currentTimeMillis();
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("Execute cost="(System.currentTimeMillis()-start));

5.拦截器

目前的代码是这样的——使用一个过滤器

package com.example.demo.filter;

import jakarta.servlet.*;

import java.io.IOException;


public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setAttribute("username","cao");
        servletRequest.setAttribute("age",22);
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("filter");
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

package com.example.demo.config;


import com.example.demo.filter.MyFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {


    @Bean
    public FilterRegistrationBean registrationBean1() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.setName("MyFilter");
        filterRegistrationBean.setOrder(1);
        return filterRegistrationBean;
    }
   
}

自定义一个拦截器实现HandlerInterceptor接口

package com.example.demo.interceptor;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String username = (String) request.getAttribute("username");
        Integer age = (Integer) request.getAttribute("age");
        System.out.println(username+"interceptor");
        System.out.println(age+"interceptor");
        return true;
    }
    //至于postHandle和afterCompletion这两个方法这里暂时不用

}

写一个配置类配置我们写的拦截器

package com.example.demo.config;

import com.example.demo.interceptor.MyInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
    }
}

看一下我们的输出结果
请添加图片描述

6.多个拦截器

继续自定义一个拦截器

package com.example.demo.interceptor;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;

public class MyInterceptor1 implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        request.setAttribute("email","2343@qq.com");
        request.setAttribute("address","北京市昌平区");
        System.out.println("MyInterceptor1");
        return true;
    }
}

注册

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/**");
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
    }
}

多个拦截器执行的顺序就是按照注册的顺序执行

7.多个过滤器和多个拦截器

过滤器

package com.example.demo.filter;

import jakarta.servlet.*;

import java.io.IOException;


public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setAttribute("username","cao");
        servletRequest.setAttribute("age",22);
        System.out.println("11111111");
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

package com.example.demo.filter;

import jakarta.servlet.*;

import java.io.IOException;

public class MyFilter1 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setAttribute("message","Filter1");
        servletRequest.setAttribute("code",200);
        System.out.println("filter1");
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

package com.example.demo.config;


import com.example.demo.filter.MyFilter;
import com.example.demo.filter.MyFilter1;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {


    @Bean
    public FilterRegistrationBean registrationBean1() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.setName("MyFilter");
        filterRegistrationBean.setOrder(1);
        return filterRegistrationBean;
    }

    @Bean
    public FilterRegistrationBean registrationBean() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter1());
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.setName("MyFilter1");
        filterRegistrationBean.setOrder(4);
        return filterRegistrationBean;
    }


}

拦截器

package com.example.demo.interceptor;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String username = (String) request.getAttribute("username");
        Integer age = (Integer) request.getAttribute("age");
        System.out.println(username+"interceptor");
        System.out.println(age+"interceptor");
        return true;
    }
    //至于postHandle和afterCompletion这两个方法这里暂时不用

}

package com.example.demo.interceptor;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;

public class MyInterceptor1 implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        request.setAttribute("email","2343@qq.com");
        request.setAttribute("address","北京市昌平区");
        System.out.println("MyInterceptor1");
        return true;
    }
}

package com.example.demo.config;

import com.example.demo.interceptor.MyInterceptor;
import com.example.demo.interceptor.MyInterceptor1;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/**");
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
    }
}

控制器

@RestController
public class FilterController {

    @GetMapping("/filter")
    public HttpResponse getFilter(HttpServletRequest request, HttpServletResponse response){
        String username = (String) request.getAttribute("username");
        String email = (String) request.getAttribute("email");
        String address = (String) request.getAttribute("address");
        System.out.println(username);
        Integer age = (Integer) request.getAttribute("age");
        System.out.println(age);
        System.out.println(email);
        System.out.println(address);
        String message = (String) request.getAttribute("message");
        System.out.println(message);
        return HttpResponse.ok();
    }
}

执行结果
请添加图片描述
结论:请求进入Tomcat容器以后,过滤器-------->拦截器--------〉控制器------>最后执行doChainFilter

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值