我已经实现了一个zuul网关服务,用于我编写的一些微服务之间的通信。我有一个特定的场景,比如我想更改其中一个自定义筛选器中的服务路径,并重定向到其他服务。zuul网关可以做到这一点吗?我曾尝试将带有更新uri的"requestURI“参数放入路由过滤器中的请求上下文中,但效果不佳
请帮帮我,伙计们,提前谢谢
发布于 2018-07-28 04:04:40
可以,停那儿吧。为此,您需要实现类型为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;
}
}
https://stackoverflow.com/questions/51551073
复制相似问题