如何在非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
相关产品推荐
相关产品推荐

