执行流程
过滤器是在请求进入容器后,但请求进入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()方法中编写相应的逻辑。