Spring cloud 从zuul筛选器发送重定向表单

Spring cloud 从zuul筛选器发送重定向表单,spring-cloud,Spring Cloud,我正在为我们的zuul过滤器集增加一个功能。 这个额外的过滤器将查看一个头并决定一个请求应该被重定向到一个我将配置的已知位置 这是筛选器的run方法的主体 @Override public Object run() { log.debug("Running the PreRouteTransMarkAndLoggingZuulFilter filter "); // retrieve redirect URL String redirec

我正在为我们的zuul过滤器集增加一个功能。 这个额外的过滤器将查看一个头并决定一个请求应该被重定向到一个我将配置的已知位置

这是筛选器的run方法的主体

 @Override
    public Object run() {
        log.debug("Running the PreRouteTransMarkAndLoggingZuulFilter filter ");
        // retrieve redirect URL
        String redirectURL = filterConfigurationBean.getRedirectURL();
        if (redirectURL.isEmpty()) {
            return null;
        }
        // get the white list for allowed entries
        Set<String> whiteList = new HashSet<>(Arrays.asList(filterConfigurationBean.getWhiteList().split(",")));
        RequestContext ctx = RequestContext.getCurrentContext();
        // if request url is part of white list then allow
        String url = ctx.getRequest().getRequestURL().toString();
        if (checkWhiteList(url, whiteList)) {
            return null;
        }
        // get headers
        // check if an authorization header is present
        if (validHeader(ctx.getRequest())) {
            return null;
        }
        // if it got to here then if no header then redirect request
        try {
            ctx.getResponse().sendRedirect(redirectURL);
        } catch (IOException e) {
            log.error("unable to send a redirect to the login page");
        }
        return null;
    }
所以我的问题是。这是从zuul执行重定向的正确方法吗

我有一个定义良好的重定向条件和一个定义良好的发送位置。如果条件被保留,但被重定向到外部位置,我不希望此请求继续


谢谢

好的,所以我玩了一下,想明白了

您需要确保RibbonRoutingFilter不会通过设置ctx.setSendZuulResponsefalse触发,因为该筛选器使用此选项来确定是否应该触发

接下来,将ctx.putFORWARD_设置为_键,重定向URL以确保SendForward筛选器将启动。将重定向URL设置为您希望它转到的位置

另外,设置ctx.getResponse.sendRedirectUrl,否则它将作为前缀附加到原始服务的路由路径上,重定向将失败

@Override
public Object run() {
    log.debug("Running the AuthorizationPassFilter filter ");

    // retrieve redirect URL
    String redirectURL = filterConfigurationBean.getRedirectURL();

    if (redirectURL.isEmpty()) {
        return null;
    }

    // get the white list for allowed entries
    Set<String> whiteList = new HashSet<>(Arrays.asList(filterConfigurationBean.getWhiteList().split(",")));

    RequestContext ctx = RequestContext.getCurrentContext();

    // if request url is part of white list then allow
    String url = ctx.getRequest().getRequestURL().toString();
    if (checkWhiteList(url, whiteList)) {
        return null;
    }

    // get headers
    // check if an authorization header is present
    if (validHeader(ctx.getRequest())) {
        return null;
    }

    // if it got to here then if no header then redirect request
    try {
        ctx.setSendZuulResponse(false);
        ctx.put(FORWARD_TO_KEY, redirectURL);
        ctx.setResponseStatusCode(HttpStatus.SC_TEMPORARY_REDIRECT);
        ctx.getResponse().sendRedirect(redirectURL);
    } catch (IOException e) {
        log.error("unable to send a redirect to the login page");
    }

    return null;

}
什么是转发密钥?我认为是org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.FORWARD\u-TO\u密钥
@Override
public Object run() {
    log.debug("Running the AuthorizationPassFilter filter ");

    // retrieve redirect URL
    String redirectURL = filterConfigurationBean.getRedirectURL();

    if (redirectURL.isEmpty()) {
        return null;
    }

    // get the white list for allowed entries
    Set<String> whiteList = new HashSet<>(Arrays.asList(filterConfigurationBean.getWhiteList().split(",")));

    RequestContext ctx = RequestContext.getCurrentContext();

    // if request url is part of white list then allow
    String url = ctx.getRequest().getRequestURL().toString();
    if (checkWhiteList(url, whiteList)) {
        return null;
    }

    // get headers
    // check if an authorization header is present
    if (validHeader(ctx.getRequest())) {
        return null;
    }

    // if it got to here then if no header then redirect request
    try {
        ctx.setSendZuulResponse(false);
        ctx.put(FORWARD_TO_KEY, redirectURL);
        ctx.setResponseStatusCode(HttpStatus.SC_TEMPORARY_REDIRECT);
        ctx.getResponse().sendRedirect(redirectURL);
    } catch (IOException e) {
        log.error("unable to send a redirect to the login page");
    }

    return null;

}