【发布时间】:2019-01-04 04:08:00
【问题描述】:
我已经实现了一个zuul网关服务,用于我编写的一些微服务之间的通信。我有一个特定的场景,比如我想在我的一个自定义过滤器中更改服务路径并重定向到其他一些服务。 zuul网关可以做到这一点吗?我尝试将带有更新 uri 的“requestURI”参数放入路由过滤器中的请求上下文,但效果不佳
请帮帮我 提前致谢
【问题讨论】:
标签: java spring-boot gateway netflix-zuul
我已经实现了一个zuul网关服务,用于我编写的一些微服务之间的通信。我有一个特定的场景,比如我想在我的一个自定义过滤器中更改服务路径并重定向到其他一些服务。 zuul网关可以做到这一点吗?我尝试将带有更新 uri 的“requestURI”参数放入路由过滤器中的请求上下文,但效果不佳
请帮帮我 提前致谢
【问题讨论】:
标签: java spring-boot gateway netflix-zuul
是的,你可以。为此,您需要使用PRE_TYPE 类型实现ZuulFilter,并使用指定的Location 标头和响应状态301 或302 更新响应。
@Slf4j
public class CustomRedirectFilter extends ZuulFilter {
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
@Override
public int filterOrder() {
return FilterConstants.SEND_FORWARD_FILTER_ORDER;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
String requestUrl = ctx.getRequest().getRequestURL().toString();
if (shouldBeRedirected(requestUrl)) {
String redirectUrl = generateRedirectUrl(ctx.getRequest());
sendRedirect(ctx.getResponse(), redirectUrl);
}
return null;
}
private void sendRedirect(HttpServletResponse response, String redirectUrl){
try {
response.setHeader(HttpHeaders.LOCATION, redirectUrl);
response.setStatus(HttpStatus.MOVED_PERMANENTLY.value());
response.flushBuffer();
} catch (IOException ex) {
log.error("Could not redirect to: " + redirectUrl, ex);
}
}
private boolean shouldBeRedirected(String requestUrl) {
// your logic whether should we redirect request or not
return true;
}
private String generateRedirectUrl(HttpServletRequest request) {
String queryParams = request.getQueryString();
String currentUrl = request.getRequestURL().toString() + (queryParams == null ? "" : ("?" + queryParams));
// update url
return updatedUrl;
}
}
【讨论】: