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