gpt4 book ai didi

java - spring boot zuul错误的请求重定向

转载 作者:行者123 更新时间:2023-11-30 05:24:16 28 4
gpt4 key购买 nike

我正在开发一个 API 网关来将请求重定向到某个微服务。这是 application.properties 文件的一部分:

#     _____                                       _____.__
# / _ \ ______ ______ ____ ____ _____/ ____\__| ____
# / /_\ \\____ \\____ \ _/ ___\/ _ \ / \ __\| |/ ___\
# / | \ |_> > |_> > \ \__( <_> ) | \ | | / /_/ >
# \____|__ / __/| __/ \___ >____/|___| /__| |__\___ /
# \/|__| |__| \/ \/ /_____/

server.port=8088
server.servlet.context-path=/PetApp

# __________ .__ _________ _____.__
# \____ /__ __ __ __| | \_ ___ \ ____ _____/ ____\__| ____
# / /| | \ | \ | / \ \/ / _ \ / \ __\| |/ ___\
# / /_| | / | / |__ \ \___( <_> ) | \ | | / /_/ >
# /_______ \____/|____/|____/ \______ /\____/|___| /__| |__\___ /
# \/ \/ \/ /_____/

#Routes for Auth
zuul.routes.tokenGenerator.path=/auth/login
zuul.routes.tokenGenerator.url=http://localhost:8086/PetApp_Auth/auth/generateToken
zuul.routes.tokenGenerator.stripPrefix=false

我正在尝试将请求从 API 网关 ( http://localhost:8080/PetApp/auth/login ) 重定向到 ( http://localhost:8086/PetApp_Auth/auth/generateToken ) 中运行的服务我已使用 postman 将请求直接发送到微服务,并且运行良好。

重要提示:我没有添加任何授权 header ,因为此端点未安全化(并且它工作完美),但我的身份验证微服务中的 API 的其余部分已安全化

但是当我尝试通过 API 网关发送请求时,我得到以下信息:

可以看出,请求被重定向到正确的微服务(Auth 服务),但没有重定向到正确的 URL,因为我对所显示的其余端点和 URL 有一个异常(exception)。

我还尝试将之前生成的授权 token 并发送到 header 中,但我得到相同的未授权

我做错了什么?

最佳答案

我已经通过添加过滤器解决了这个问题。Zuul 构建了完整的 URL,如服务服务定义的 URL + PATH,因此我实现了一个删除路径的过滤器,现在请求在其他微服务中完美接收。无论如何,我计划更改端点定义,使其具有与微服务中定义的端点路径相同的端点路径,因为使用可变路径,我认为不可能解决这个问题。我还将检查是否使用其他解决方案,如 nginx 或 varnish,如 @Maxim Sagaydachny 建议的

@Component
public class PathConfigFilter extends ZuulFilter {

@Autowired
private ZuulProperties zuulProperties;

@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}

@Override
public int filterOrder() {
return FilterConstants.PRE_DECORATION_FILTER_ORDER + 1;
}

@Override
public boolean shouldFilter() {
return RequestContext.getCurrentContext().getFilterExecutionSummary().toString()
.contains( "PreDecorationFilter[SUCCESS]" );
}

@Override
public Object run() {

RequestContext context = RequestContext.getCurrentContext();

String originalRequestPath = (String) context.get(FilterConstants.REQUEST_URI_KEY);

//PathVariable change
URL routeHost = (URL) context.get( "routeHost");
String modifiedPathVariable = processPathVariableRoutes( routeHost.getPath(), originalRequestPath );
if(modifiedPathVariable != null){
try {
URL newUrl = new URL(routeHost,modifiedPathVariable);
context.put("routeHost", newUrl);
} catch (MalformedURLException e) {
throw new ApiGatewayException( ApiGatewayErrorCodes.PATH_VARIABLE_ERROR );
}
}

//Delete the path because the full path is defined in properties
context.put(FilterConstants.REQUEST_URI_KEY, "");

return null;
}

private String processPathVariableRoutes(String routeHost, String requestPath){

if(!routeHost.contains( "*" )){
return null;
}

ArrayList<String> splitedRoute = new ArrayList<>(Arrays.asList(routeHost.split( "/" )));
splitedRoute.remove( 0 );
String context = "/" + splitedRoute.get( 0 );
String realPath = context + requestPath;

return realPath;
}
}

非常感谢。

关于java - spring boot zuul错误的请求重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58994434/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com