springbboot拦截器,过滤器,监听器及执行流程

执行流程

过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前

在这里插入图片描述
请求按照上图进入conteoller后执行完再返回

过滤器(Filter):

过滤器是Servlet规范中定义的一种组件,可以用于在请求进入Web应用程序之前或响应离开Web应用程序之前对请求进行预处理或后处理。过滤器的应用方式是通过在web.xml或Servlet注解中配置。

执行流程:
请求进入Web容器 → 过滤器预处理请求 → 请求传递给下一个过滤器或目标Servlet → 响应离开Web容器之前过滤器后处理响应。

拦截器(Interceptor):

拦截器是Spring框架提供的一种组件,可以用于在请求进入控制器(Controller)之前或渲染视图之前执行自定义逻辑。拦截器的应用方式是通过实现HandlerInterceptor接口并注册到Spring容器中。

执行流程:
请求进入DispatcherServlet → 拦截器预处理请求 → 请求传递给下一个拦截器或控制器 → 控制器处理请求 → 渲染视图 → 拦截器后处理响应。

监听器(Listener):

监听器是Servlet规范中定义的一种组件,可以用于监听Web应用程序中的事件,例如应用程序启动、请求到达、会话创建和销毁等。监听器的应用方式是通过在web.xml或Servlet注解中配置。

执行流程:
监听器注册到Web容器中 → 监听器监听特定事件发生并执行相应逻辑。

拦截器的使用

创建一个拦截器类:
首先,您需要创建一个实现HandlerInterceptor接口的拦截器类。该接口定义了在请求处理的不同阶段执行的方法,例如在请求之前、请求处理之后以及请求完成之后。

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

public class CustomInterceptor implements HandlerInterceptor {
    
    

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    
        // 在请求之前执行的逻辑
        return true; // 返回true继续执行请求,返回false中断请求
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
    
        // 在请求处理之后执行的逻辑
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
    
        // 在请求完成之后执行的逻辑
    }
}

注册拦截器:
接下来,您需要将拦截器注册到Spring Boot应用程序中。可以通过创建一个配置类来完成这一步,使用WebMvcConfigurer接口的addInterceptors()方法注册拦截器。

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 CustomInterceptor())
                .addPathPatterns("/**"); // 可以指定拦截的路径,例如 "/api/**"
    }
}

过滤器的使用

创建一个过滤器类:
创建一个实现javax.servlet.Filter接口的过滤器类,实现过滤器的逻辑。

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

public class CustomFilter implements Filter {
    
    

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    
    
        // 初始化过滤器(可选)
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    
    
        // 过滤逻辑
        chain.doFilter(request, response); // 传递请求给下一个过滤器或目标Servlet
    }

    @Override
    public void destroy() {
    
    
        // 销毁过滤器(可选)
    }
}

注册过滤器:
在Spring Boot项目中,您可以使用@WebFilter注解来注册过滤器。在您想要应用过滤器的类上添加该注解,并设置过滤器的URL模式。

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@Component
@WebFilter(urlPatterns = "/api/*") // 指定过滤的URL模式
@Order(1) // 指定过滤器顺序
public class CustomFilter implements Filter {
    
    

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    
    
        // 初始化过滤器(可选)
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    
    
        // 过滤逻辑
        chain.doFilter(request, response); // 传递请求给下一个过滤器或目标Servlet
    }

    @Override
    public void destroy() {
    
    
        // 销毁过滤器(可选)
    }
}

启动应用程序:
在启动Spring Boot应用程序时,过滤器将自动注册并应用于相应的URL模式。

请注意,当使用注解进行过滤器的注册时,需要确保在Spring Boot主类上添加@ServletComponentScan注解,以扫描和加载@WebFilter注解。

这样,您就可以在Spring Boot项目中使用过滤器了。过滤器可以用于各种场景,如请求日志记录、字符编码设置、安全验证等。根据您的需求,您可以在过滤器的doFilter()方法中编写相应的逻辑。

猜你喜欢

转载自blog.csdn.net/wang121213145/article/details/131619563