springboot 过滤器

本文介绍了SpringBoot中过滤器(Filter)和拦截器(HandlerInterceptor)的两种实现方式及其配置。过滤器用于全局请求处理,如打印请求URI和方法;拦截器则用于在请求进入处理器之前进行预处理,如权限验证。同时展示了如何通过配置类注册过滤器,并使用注解配置拦截器,以及如何设置拦截器的白名单路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

springboot 过滤器

方式一

	package com.springboot.stu.filter;

	import org.springframework.core.annotation.Order;
	
	import javax.servlet.*;
	import javax.servlet.annotation.WebFilter;
	import javax.servlet.http.HttpServletRequest;
	import java.io.IOException;
	
	//urlPatterns: 拦截的请求配置(/*: 所有请求)
	@WebFilter(urlPatterns = "/*", filterName = "myFilter")
	@Order(1) //越小优先级越高
	public class MyFilter implements Filter {
	    @Override
	    public void init(FilterConfig filterConfig) throws ServletException {
	        System.err.println("init");
	    }
	
	    @Override
	    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
	        HttpServletRequest request = (HttpServletRequest) servletRequest;
	        System.out.println(request.getRequestURI());
	        System.out.println(request.getMethod());
	        filterChain.doFilter(servletRequest, servletResponse);
	    }
	
	    @Override
	    public void destroy() {
	        System.err.println("distory");
	    }
	}

	@SpringBootApplication
	@ServletComponentScan // 
	public class SpringbootStuApplication {
	
	    public static void main(String[] args) {
	        SpringApplication.run(SpringbootStuApplication.class, args);
	    }
	}

方式二

//@WebFilter(urlPatterns = "/*", filterName = "myFilter")
//@Order(1) //越小优先级越高
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.err.println("init");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        System.out.println(request.getRequestURI());
        System.out.println(request.getMethod());
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        System.err.println("distory");
    }
}
package com.springboot.stu.config;

import com.springboot.stu.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 MyFilter myFilter(){
        return new MyFilter();
    }
    @Bean
    public FilterRegistrationBean filterRegistrationBean(MyFilter myFilter ){
        FilterRegistrationBean filterRegistrationBean= new FilterRegistrationBean();
        filterRegistrationBean.setFilter(myFilter);
        filterRegistrationBean.setOrder(1);
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.setName("myFilter");
        return filterRegistrationBean;
    }
}

简单应用

//@WebFilter(urlPatterns = "/*", filterName = "myFilter")
//@Order(1) //越小优先级越高
public class MyFilter implements Filter {

    // 开放接口 //open.url=/**/pub/**
    @Value("${open.url}")
    private String openUrl;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.err.println("init");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;

        AntPathMatcher antPathMatcher = new AntPathMatcher();
        /*访问的是否是开放资源*/
        if (!antPathMatcher.match(openUrl, request.getRequestURI())) {

            System.out.println("正在访问私有资源");
            if (StringUtils.isEmpty(request.getHeader("token"))) {
                System.out.println("没有token,正在跳转到登录页面");
                servletRequest.getRequestDispatcher("/pub/login").forward(servletRequest, servletResponse);
                return;
            }
        }
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        System.err.println("distory");
    }
}

拦截器

package com.springboot.stu.interceptor;

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

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

public class MyInterceptor implements HandlerInterceptor {

    /*请求访问前调用
    * return true  :  放行
    * return false : 拦截
    * */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("访问路径: " + request.getRequestURI());
        return true;
    }
    /*请求访问后调用*/

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

    /*整个流程(请求结束)之后调用*/
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");

    }
}

package com.springboot.stu.config;

import com.springboot.stu.interceptor.MyInterceptor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
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 {

    @Value("${open.url}")
    private String openUrl;

    /*拦截器*/
    @Bean
    public MyInterceptor myInterceptor(){
        return  new MyInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor())
                .addPathPatterns("/**")     // 要拦截的api
                .excludePathPatterns(openUrl);  // 白名单--公开api(不会被拦截器处理)
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值