springboot整合拦截器、过滤器、解决跨域问题。

文章介绍了如何在SpringBoot应用中创建和注册自定义拦截器以实现在请求处理前、后进行操作,以及创建过滤器进行请求过滤。同时,详细阐述了如何配置CorsFilter处理跨域请求,允许来自任意源的请求。整个流程包括拦截器的preHandle、postHandle和afterCompletion方法的调用,以及过滤器的doFilter方法执行。

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

1、首先,创建一个自定义的拦截器类,实现HandlerInterceptor接口,代码如下:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

@Component
public class CustomInterceptor implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("请求拦截器 - 在请求处理之前调用");
        return true; // 返回 true 表示允许请求继续进行
    }
    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("请求拦截器 - 在请求处理之后调用,但在视图被渲染之前");
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("请求拦截器 - 在请求处理完成后调用");
    }
}

2、在应用程序的配置类中注册拦截器,代码如下:

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;

@Configuration
public class AppConfig implements WebMvcConfigurer {

    private final CustomInterceptor customInterceptor;

    @Autowired
    public AppConfig(CustomInterceptor customInterceptor) {
        this.customInterceptor = customInterceptor;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(customInterceptor);
    }
}

3、创建一个自定义的过滤器类,实现javax.servlet.Filter接口,代码如下:

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

@WebFilter(urlPatterns = "/*")
public class CustomFilter implements Filter {
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤器 - 初始化");
    }
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("过滤器 - 请求处理之前");
        chain.doFilter(request, response); // 继续请求处理
        System.out.println("过滤器 - 请求处理之后");
    }
    
    @Override
    public void destroy() {
        System.out.println("过滤器 - 销毁");
    }
}

4、在应用程序的主类上添加@ServletComponentScan注解,以便自动扫描过滤器:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
@ServletComponentScan
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

5、对于跨域请求,可以通过配置CorsFilter来处理。代码如下:

import org.springframework.web.filter.CorsFilter;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedOrigin("*"); // 允许所有来源
        config.addAllowedMethod("*"); // 允许所有HTTP方法
        config.addAllowedHeader("*"); // 允许所有请求头
        source.registerCorsConfiguration("/**", config); // 对所有路径生效
        return new CorsFilter(source);
    }
}

通过以上配置,将允许来自任意来源的请求,使用任意HTTP方法和请求头。在UrlBasedCorsConfigurationSource中,将CorsConfiguration注册到所有路径上(“/**”)。

6、发起一个请求测试,整个流程是这样的:
流程图

通过以上代码,可以实现拦截器、过滤器和跨域处理。当用户发起请求时,拦截器将在请求处理之前调用,过滤器将在拦截器之前进行请求处理,然后拦截器将在请求处理完成后调用。跨域处理将允许来自任意来源的请求。

解释:在应用程序的配置类中注册拦截器是为了告诉Spring Boot应该在请求处理过程中使用哪些拦截器。

当你创建一个自定义的拦截器并实现HandlerInterceptor接口后,该拦截器并不会自动生效。你需要将其注册到Spring Boot的拦截器链中,以便它能够拦截到相应的请求。

通过在应用程序的配置类中注册拦截器,你可以告诉Spring Boot应该使用哪些拦截器,并定义它们的顺序。拦截器可以用于在请求处理的不同阶段进行前置处理、后置处理以及请求完成后的处理。例如,你可以在拦截器中进行身份验证、日志记录、请求参数处理等操作。

通过将拦截器注册到配置类中,Spring Boot会在请求到达时自动调用相应的拦截器方法,并按照注册的顺序依次执行。

因此,拦截器的注册是为了将其纳入Spring Boot的请求处理流程中,以便拦截器能够对请求进行相应的处理操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FirstTalent

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值