Spring Boot是否具备类似ASP.NET Core的HTTP请求中间件管道?如何构建?
Spring Boot 中实现类似 ASP.NET Core 的 HTTP 中间件管道
Spring Boot 完全支持类似 ASP.NET Core 的请求链式处理机制,主要通过 Servlet Filter 和 Spring HandlerInterceptor 实现,结合全局异常处理可以轻松完成多组件请求处理、异常重定向的需求。以下是具体实现方案:
一、核心方案:Servlet Filter 链式处理
Servlet Filter 是 Servlet 规范的原生组件,执行逻辑和 ASP.NET Core 中间件高度相似——请求进入时依次经过各个 Filter,响应返回时反向执行,适合处理全局请求逻辑。
1. 自定义 Filter 实现请求处理
创建多个 Filter 分别承担不同职责,比如日志记录、权限校验,同时在 Filter 中捕获异常并重定向到错误页面:
// 日志记录 Filter import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; public class RequestLoggingFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; System.out.println("开始处理请求:" + req.getRequestURI()); try { // 传递请求到下一个 Filter/Controller chain.doFilter(request, response); } catch (Exception e) { // 捕获异常,转发到错误页面 req.getRequestDispatcher("/error").forward(request, response); } System.out.println("请求处理完成:" + req.getRequestURI()); } }
// 权限校验 Filter import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; public class AuthFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; String authToken = req.getHeader("Authorization"); if (authToken == null || !authToken.startsWith("Bearer ")) { // 权限不足,转发到未授权页面 req.getRequestDispatcher("/unauthorized").forward(request, response); return; } // 校验通过,继续执行后续逻辑 chain.doFilter(request, response); } }
2. 注册 Filter 并指定执行顺序
通过 FilterRegistrationBean 注册 Filter,设置 order 控制执行优先级(数值越小,执行越早):
import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class FilterConfig { @Bean public FilterRegistrationBean<RequestLoggingFilter> loggingFilter() { FilterRegistrationBean<RequestLoggingFilter> registration = new FilterRegistrationBean<>(); registration.setFilter(new RequestLoggingFilter()); registration.addUrlPatterns("/*"); // 拦截所有请求 registration.setOrder(1); // 第一个执行 return registration; } @Bean public FilterRegistrationBean<AuthFilter> authFilter() { FilterRegistrationBean<AuthFilter> registration = new FilterRegistrationBean<>(); registration.setFilter(new AuthFilter()); registration.addUrlPatterns("/api/*"); // 仅拦截API请求 registration.setOrder(2); // 第二个执行 return registration; } }
二、Spring MVC 专属:HandlerInterceptor 拦截器
如果你的业务和 Spring MVC 深度绑定,HandlerInterceptor 是更合适的选择——它能在 Controller 方法执行前后、视图渲染阶段介入,适合处理和业务逻辑关联的拦截逻辑。
1. 自定义 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 PerformanceInterceptor implements HandlerInterceptor { private long startTime; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { startTime = System.currentTimeMillis(); System.out.println("Controller方法执行前:" + request.getRequestURI()); return true; // 返回true才会继续执行后续拦截器和Controller } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { long duration = System.currentTimeMillis() - startTime; System.out.println("Controller方法执行耗时:" + duration + "ms"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { if (ex != null) { // 捕获Controller执行异常,重定向到错误页面 response.sendRedirect("/error"); } } }
2. 注册 Interceptor
通过 WebMvcConfigurer 注册拦截器,指定拦截路径:
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 WebMvcConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new PerformanceInterceptor()) .addPathPatterns("/api/**") .excludePathPatterns("/error", "/unauthorized"); // 排除错误页面路径 } }
三、全局异常重定向优化
除了在 Filter/Interceptor 中捕获异常,还可以用 @ControllerAdvice 实现全局异常统一处理,避免重复代码:
import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.servlet.ModelAndView; @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ModelAndView handleAllExceptions(Exception ex) { ModelAndView mv = new ModelAndView(); mv.addObject("errorMsg", ex.getMessage()); mv.setViewName("error"); // 跳转到名为error的视图页面 return mv; } }
四、Filter 与 HandlerInterceptor 选型建议
- Filter:属于 Servlet 规范,拦截范围覆盖所有 HTTP 请求(包括静态资源),执行时机更早,适合处理跨域、日志、全局权限校验等通用逻辑。
- HandlerInterceptor:属于 Spring MVC 范畴,仅拦截 Controller 请求,能获取 Controller 方法信息,适合处理和业务逻辑绑定的拦截需求(如性能监控、参数预处理)。
你可以根据业务场景组合使用两者,构建灵活的请求处理管道。
内容的提问来源于stack exchange,提问作者Mohamed Selim
相关产品推荐
相关产品推荐

