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

如何在非MVC应用的Spring Cloud Zuul 1.1.0M4中添加全局请求拦截器

在Zuul中实现全局请求拦截的替代方案

嘿,既然你的应用不是MVC架构,没法用WebMvcConfigurerAdapter,那完全可以用Zuul自身提供的拦截机制来搞定全局请求拦截,这才是更贴合网关场景的做法。下面给你两种最常用的有效方案:

方案一:自定义ZuulFilter(推荐)

Zuul的核心就是过滤器链,你可以自定义一个前置过滤器来拦截所有请求,实现逻辑完全可控。

步骤:

  • 创建一个类继承ZuulFilter,并重写关键方法:
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

@Component
public class GlobalRequestFilter extends ZuulFilter {

    @Override
    public String filterType() {
        // 前置过滤器,在请求路由前执行
        return "pre";
    }

    @Override
    public int filterOrder() {
        // 过滤器执行顺序,数值越小越先执行
        return 1;
    }

    @Override
    public boolean shouldFilter() {
        // 返回true表示对所有请求生效
        return true;
    }

    @Override
    public Object run() throws ZuulException {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        
        // 这里写你的拦截逻辑,比如获取请求信息、校验参数、记录日志等
        System.out.println("拦截到请求:" + request.getMethod() + " " + request.getRequestURI());
        
        // 如果需要拦截请求(比如校验不通过),可以设置以下属性
        // ctx.setSendZuulResponse(false);
        // ctx.setResponseStatusCode(403);
        // ctx.setResponseBody("权限不足,请求被拦截");
        
        return null;
    }
}
  • 确保这个类被Spring容器扫描到(加上@Component注解即可),启动应用后,所有经过Zuul的请求都会触发这个过滤器的逻辑。

方案二:使用Zuul的RequestInterceptor

如果你的需求相对简单,也可以实现RequestInterceptor接口来拦截请求,代码会更简洁一些。

步骤:

  • 创建拦截器类并实现RequestInterceptor:
import com.netflix.zuul.context.RequestContext;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;

@Component
public class GlobalRequestInterceptor implements com.netflix.zuul.interceptor.RequestInterceptor {

    @Override
    public void intercept(RequestContext ctx) {
        HttpServletRequest request = ctx.getRequest();
        // 这里编写你的拦截逻辑,比如日志记录、请求头修改等
        System.out.println("通过RequestInterceptor拦截到请求:" + request.getRequestURL());
    }
}
  • 同样通过@Component让Spring管理这个类,它会自动被Zuul加载,作用于所有经过网关的请求。

小提示

  • 如果你需要针对特定路由做拦截,可以在shouldFilter()方法(针对ZuulFilter)里通过RequestContext获取路由信息做判断,比如ctx.get("proxy")可以拿到当前路由的ID。
  • 如果拦截后需要拒绝请求,一定要设置ctx.setSendZuulResponse(false),同时指定响应状态码和内容,避免请求长时间挂起。

内容的提问来源于stack exchange,提问作者dilipyadav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:26:18