You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 09:45:50