Spring Cloud 学习笔记 —— 服务网关Zuul 的请求过滤及其他配置

    科技2025-08-24  24

    11.2.2 请求过滤

    对于来自客户端的请求,可以在 Zuul 中进行预处理,例如权限判断等,简单演示一个权限判断的例子

    (1)定义一个过滤器 PermissFilter 继承 ZuulFilter,实现其中的方法,增加 @Component 注解,方法含义,直接看代码: package org.javaboy.zuul; 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 PermissFilter extends ZuulFilter { /** * 过滤起的类型,权限判断一般为 pre * @return */ @Override public String filterType() { return "pre"; } /** * 过滤器的优先级 * @return */ @Override public int filterOrder() { return 0; } /** * 是否过滤 * @return */ @Override public boolean shouldFilter() { //比如判断是否转发,RequestContext.getCurrentContext()通过获取请求上下文 //RequestContext cxt = RequestContext.getCurrentContext(); //HttpServletRequest request = cxt.getRequest(); return true; } /** * 核心的过滤逻辑写在这里 * @return 这个方法虽然有返回值,但是这个返回值目前无所谓 * @throws ZuulException */ @Override public Object run() throws ZuulException { //如果不满足在这个方法里处理,如果满足什么都不用做,会自动往下走 RequestContext cxt = RequestContext.getCurrentContext(); HttpServletRequest request = cxt.getRequest();//获取当前请求 String username = request.getParameter("username"); String password = request.getParameter("password"); if(!"javaboy".equals(username) || !"123".equals(password)){ //如果请求条件不满足,直接再这里给出响应 cxt.setSendZuulResponse(false);//请求到此为止 cxt.setResponseStatusCode(401);//响应码 cxt.addZuulResponseHeader("content-type","text/html;charset=utf-8");//响应头 cxt.setResponseBody("非法访问");//响应体 } return null; } } (2)测试请求,必须携带参数 username=javaboy、password=123才能通过:

    11.2.3 Zuul 其他配置

    匹配规则

    例如有两个服务,一个叫 consumer,另一个叫 consumer-hello,在做路由设置时,假如出现了如下配置: zuul.routes.consumer=/consumer/** zuul.routes.consumer-hello=/consumer/hello/** 此时,如果访问地址:http://localhost:2020/consumer/hello/123,那么这个地址会出现冲突。实际上这个地址是想跟 consumer-hello 匹配;如何解决?这时候把配置文件改为 yml 即可;因为配置是线性匹配规则, properties 文件是无序,把 consumer-hello 的配置写在前面也不一定生效,而 yml 文件是有序的,这时候把 consumer-hello 写在前面就可以了 spring: application: name: zuul server: port: 2020 eureka: client: service-url: defaultZone: http://localhost:1111/eureka zuul: routes: consumer-helo: /consumer/hello/** consumer: /consumer/**

    忽略路径 忽略服务,忽略路径

    默认情况下,Zuul 注册到 Eureka 上之后, Eureka 上所有注册服务都会被自动代理。如果不想给某个服务做代理,可以忽略改服务,配置如下: zuul.ignored-services=provider

    上面这个配置表示忽略 provider 服务,此时就不会自动代理 provider 服务了。

    也可以忽略某一类地址 zuul.ignored-patterns=/**/hello/**

    这个表示请求中如果包含 hello,则不做代理。 前缀

    也可以给路由加前缀 zuul.prefix=/javaboy

    这样,以后经过网关所有的请求地址必须额外加前缀 /javaboy:

    Processed: 0.012, SQL: 8