Spring security 如何编写netflix zuul筛选器以更改响应位置标题属性?

Spring security 如何编写netflix zuul筛选器以更改响应位置标题属性?,spring-security,spring-cloud,netflix-zuul,spring-cloud-netflix,Spring Security,Spring Cloud,Netflix Zuul,Spring Cloud Netflix,我有一个重定向到x.jsp的下游服务,例如,这个位置不在网关路由中 gateway route --- localhost:8080/app - 192.168.1.1:80 (DownStream app) 在下游应用程序中,当用户未登录时,它将重定向到192.168.1.1:80/Login.jsp,它位于响应的位置标题中 此URL未使用网关 我想编写一个zuul筛选器,通过在zuul routes dynamic中映射来更改此重定向url,例如,对于在zuul筛选器中路由的每个url,通

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

gateway route --- localhost:8080/app - 192.168.1.1:80 (DownStream app)
在下游应用程序中,当用户未登录时,它将重定向到192.168.1.1:80/Login.jsp,它位于响应的
位置
标题中

此URL未使用网关


我想编写一个zuul筛选器,通过在zuul routes dynamic中映射来更改此重定向url,例如,对于在zuul筛选器中路由的每个url,通过网关更改
位置
头。我该怎么做呢?

您的下游应用程序应该尊重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;
}
@覆盖
公共字符串筛选器类型(){
返回“post”;
}
@凌驾
public int filterOrder(){
返回0;
}
@凌驾
公共布尔值shouldFilter(){
int status=RequestContext.getCurrentContext().getResponseStatusCode();
返回状态>=300&&status<400;
}
@凌驾
公共对象运行(){
RequestContext ctx=RequestContext.getCurrentContext();
Map requestHeaders=ctx.getZuulRequestHeaders();
可选locationHeader=ctx.getZuulResponseHeaders()
.stream()
.filter(stringpair->LOCATION.equals(stringpair.first()))
.findFirst();
if(locationHeader.isPresent()){
字符串oldLocation=locationHeader.get().second();
字符串newLocation=。。。
locationHeader.get().setSecond(newLocation);
}
返回null;
}

您的下游应用程序应该尊重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;
}
@覆盖
公共字符串筛选器类型(){
返回“post”;
}
@凌驾
public int filterOrder(){
返回0;
}
@凌驾
公共布尔值shouldFilter(){
int status=RequestContext.getCurrentContext().getResponseStatusCode();
返回状态>=300&&status<400;
}
@凌驾
公共对象运行(){
RequestContext ctx=RequestContext.getCurrentContext();
Map requestHeaders=ctx.getZuulRequestHeaders();
可选locationHeader=ctx.getZuulResponseHeaders()
.stream()
.filter(stringpair->LOCATION.equals(stringpair.first()))
.findFirst();
if(locationHeader.isPresent()){
字符串oldLocation=locationHeader.get().second();
字符串newLocation=。。。
locationHeader.get().setSecond(newLocation);
}
返回null;
}

那么,您是否尝试了Zuul过滤器来执行此操作,但它不起作用?是的,不起作用。您可以提供一个示例应用程序吗?或任何配置或除“它不起作用”以外的任何更多信息?我们是否可以查看一些代码来确定您尝试了什么以及哪些失败。那么您是否尝试了Zuul筛选器来执行此操作,但它不起作用?是的,不起作用。您是否可以提供一个示例应用程序?或任何配置或除“它不起作用”之外的任何其他信息?我们是否可以查看一些代码来确定您尝试了什么以及哪些失败。