如何使用 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;
}
}
我正在使用微服务架构,其中 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;
}
}