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

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的请求处理流程中,以便拦截器能够对请求进行相应的处理操作。

猜你喜欢

转载自blog.csdn.net/scj0725/article/details/131292607
今日推荐