如何编写netflix zuul过滤器来更改响应位置标头属性?

时间:2017-02-12 18:14:56

标签: spring-security spring-cloud netflix-zuul spring-cloud-netflix

我有下游服务,重定向到x.jsp这个位置不在网关路由中,例如

gateway route --- localhost:8080/app - 192.168.1.1:80 (DownStream app)

在DownStream应用程序中,当用户未登录时,它会重定向到192.168.1.1:80/Login.jsp,该页面位于响应的Location标题中。

此网址未使用网关。

我想编写一个zuul过滤器,通过在zuul路由动态中映射来更改此重定向URL,例如网关在zuul过滤器更改Location标头中的每个URL。我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

您的下游应用应该尊重x-forwarded- *标头,而不是像这样生成重定向。但是,以下过滤器将为您更改重定向位置:

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

@Override
public int filterOrder() {
    return 0;
}

@Override
public boolean shouldFilter() {
    int status = RequestContext.getCurrentContext().getResponseStatusCode();
    return status >= 300 && status < 400;
}

@Override
public Object run() {
    RequestContext ctx = RequestContext.getCurrentContext();
    Map<String, String> requestHeaders = ctx.getZuulRequestHeaders();
    Optional<Pair<String, String>> locationHeader = ctx.getZuulResponseHeaders()
                .stream()
                .filter(stringStringPair -> LOCATION.equals(stringStringPair.first()))
                .findFirst();

        if (locationHeader.isPresent()) {
            String oldLocation = locationHeader.get().second();
            String newLocation = ...
            locationHeader.get().setSecond(newLocation);
        }
    return null;
}