如何使用 Token 为 URL 配置 Zuul 路由?

How do I configure Zuul routing for URL with Token?

我正在使用微服务架构,其中 Zuul 网关联系 Eureka 服务器以发现已发布的微服务。我希望我的 zuul 网关接受特定格式的路径。

它收到了一个 URL 呼叫,其中包含作为令牌发送的会员 ID。因为我们想避免在 URLs 中发送敏感信息,这些过期令牌将由 Zuul 解析,例如转换为社会安全号码,并且 ssn 将在 header 中发送。

例如银行账户 GET:

http://zuulgateway/member/11/account/

将映射到

http://microservice/account X-MEMBER-SSN: 1112223333

我的计划是设置一个"pre" Zuul 过滤器来解析成员令牌“11”并用它来获取SSN,然后将其添加到header.

但我不确定如何配置此路由,或者是否可行。

zuul.routes.account.path: /member/*/**

没有实现。我可以使用其他机制吗?

Zuul github 上有一些关于此问题的论坛帖子,但 none 的解决方案对我有用。我想不通为什么并最终意识到:从我的 Spring 工具套件热部署到 Zuul 正在重新启动应用程序,但没有部署最新的更改(也许这最终是对 JRebel 的认可!)。一旦我意识到这一点,我就开始尝试 stop/deploy/start 编码,直到我得到一个使用 ZuulFilter 的解决方案。

解决方案涉及一个 "pre" 过滤器,它重写上下文 URL 以删除 URL 的 /member/\d+/ 部分,以便上下文可以直接映射到

下面是一些示例代码:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;

@Component
public class SpecialFilter extends ZuulFilter {

    private static final String REQUEST_URI_KEY = "requestURI";
    private static final Pattern URL_PATTERN = Pattern.compile("^\/?(\d+)\/(.+)$");

    @Override
    public boolean shouldFilter() {
        return isMember(RequestContext.getCurrentContext());
    }

    private boolean isMember(RequestContext currentContext) {
        String path = (String) currentContext.get(REQUEST_URI_KEY);
        Matcher m = URL_PATTERN.matcher(path);
        return m.matches();
    }

    @Override
    public Object run() {
        RequestContext context = RequestContext.getCurrentContext();
        String originalRequestPath = (String) context.get(REQUEST_URI_KEY);
        Matcher m = URL_PATTERN.matcher(originalRequestPath);
        System.out.println("Parsing original "+originalRequestPath + " against " + URL_PATTERN.toString());
        if(!m.matches()) {
            System.err.println("Invalid URL");
            return null;
        }
        String ssn = translateSSN(m.group(1));
        String requestPath = m.group(2);
        String modifiedRequestPath = "/" + requestPath;
        context.put(REQUEST_URI_KEY, modifiedRequestPath);

        //Add this header to the request
        context.addZuulRequestHeader("X-SSN", ssn);
        return null;
    }

    @Override
    public String filterType() {
        return "pre";
    }

    @Override
    public int filterOrder() {
        // Should proceed this filter
        return FilterConstants.PRE_DECORATION_FILTER_ORDER + 1;
    }

}