之前已经详细介绍过了过滤器Filter 和 拦截器Interceptor 了,本文将两种拦截请求的技术做一个对比讲解!
回顾: 过滤器Filter详解 拦截器Interceptor详解
Filter,中文名过滤器,是 Servlet 规范中定义的一种拦截机制,如同应用的第一道防线——护城河,所有 HTTP 请求都要经过它的洗礼。它独立于 Spring 框架,地位超然,不受框架限制,任何 Web 应用都可以使用它来实现通用的请求处理逻辑。
想象一下,Web 应用就像一座城堡,而 Filter 就是城堡外围的护城河,所有进出城堡的请求都必须经过它。
Spring Boot 为我们提供 @WebFilter 注解,让我们可以用更简洁、优雅的方式配置 Filter:
1.2.1 创建 Filter
@WebFilter(urlPatterns = {"/user/*", "/admin/*"}, filterName = "securityFilter")
// 使用 @WebFilter 注解声明这是一个 Filter,并指定拦截路径和过滤器名称
public class SecurityFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化资源,例如加载用户权限配置文件
System.out.println("SecurityFilter 初始化...");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 1. 获取请求信息,例如请求路径、请求参数
HttpServletRequest httpRequest = (HttpServletRequest) request;
String requestURI = httpRequest.getRequestURI();
// 2. 执行业务逻辑,例如校验用户登录状态、权限验证
System.out.println("SecurityFilter 拦截到请求: " + requestURI);
if (!isAuthenticated(httpRequest)) { // 模拟用户认证逻辑
// 未通过验证,跳转到登录页面或者返回错误信息
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.sendRedirect("/login"); // 跳转到登录页面
return;
}
// 3. 放行请求到下一个 Filter 或目标资源
chain.doFilter(request, response);
// 4. 后置处理,例如记录日志
System.out.println("SecurityFilter 处理请求完成: " + requestURI);
}
@Override
public void destroy() {
// 释放资源
System.out.println("SecurityFilter 销毁...");
}
// 模拟用户认证逻辑
private boolean isAuthenticated(HttpServletRequest request) {
// 这里可以根据实际需求实现,例如检查 Session 中是否存在用户信息
return true;
}
}
1.2.2 配置 Filter
在 Spring Boot 应用启动类上添加 @ServletComponentScan 注解,自动扫描并注册 Filter:
@SpringBootApplication
@ServletComponentScan // 启用 Servlet 组件扫描,自动发现并注册 Filter
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
Interceptor,中文名拦截器,是 Spring MVC 框架提供的一种更精细化的拦截机制,它专注于拦截控制器方法,就像城堡的城门守卫,只对进入城门的人进行检查。
想象一下,Interceptor 就像城堡的城门守卫,在客人进入房间之前、离开房间之后,以及处理房间事务的过程中,都会提供周到的服务:
2.2.1 创建 Interceptor
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 1. 获取请求信息,例如请求路径、请求参数
String requestURI = request.getRequestURI();
// 2. 执行业务逻辑,例如权限验证
System.out.println("AuthInterceptor 拦截到请求: " + requestURI);
if (!hasPermission(request)) { // 模拟权限验证逻辑
// 如果验证失败,设置错误信息,并跳转到错误页面
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
request.setAttribute("message", "您没有权限访问该资源!");
request.getRequestDispatcher("/error").forward(request, response);
return false;
}
// 3. 放行请求
System.out.println("AuthInterceptor 放行请求: " + requestURI);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 修改模型数据,例如添加用户信息
if (modelAndView != null) {
modelAndView.addObject("username", "John Doe");
}
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 记录日志信息
System.out.println("AuthInterceptor 请求处理完成: " + request.getRequestURI());
if (ex != null) {
System.out.println("发生异常: " + ex.getMessage());
}
}
// 模拟权限验证逻辑
private boolean hasPermission(HttpServletRequest request) {
// 这里可以根据实际需求实现,例如检查用户角色
return true;
}
}
2.2.2 配置 Interceptor
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 添加拦截器,并配置拦截路径
registry.addInterceptor(new AuthInterceptor())
.addPathPatterns("/admin/**") // 拦截 /admin/ 下的所有请求
.excludePathPatterns("/admin/login"); // 排除 /admin/login 请求
}
}
特性 | Filter | Interceptor |
---|---|---|
规范 | Servlet 规范,不依赖 Spring 框架 | Spring MVC 框架的一部分 |
拦截范围 | 所有 Web 应用,拦截所有请求 | 仅限 Spring MVC 应用,拦截控制器方法 |
执行顺序 | Filter 链式调用,按配置顺序执行 | Interceptor 链式调用,按配置顺序执行 |
方法丰富度 | 只有一个 doFilter 方法 | preHandle、postHandle、afterCompletion 三个方法 |
应用场景 | 偏向底层、通用性需求,例如字符编码、安全过滤、Gzip 压缩 | 偏向业务逻辑,例如权限控制、日志记录、性能监控 |
选择建议:
Filter 和 Interceptor 都是 Spring Boot 应用中不可或缺的请求拦截利器,它们就像城堡的护城河和城门守卫,在不同阶段、不同层面守护着应用的安全。开发者需要根据具体的应用场景选择合适的拦截器,并充分利用 Spring Boot 提供的便捷 API 和灵活的配置,才能构建出安全、高效、用户体验俱佳的 Web 应用。
以上就是关于过滤器Filter 和 拦截器Interceptor 的对比讲解了,希望对各位看官有所帮助,下期见,谢谢~