我正在开发一个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)我已经和邮递员一起将请求直接发送到微服务,它运行得非常完美。
重要提示:我没有添加任何授权头,因为这个endpoint没有安全化(它工作得很好),但我的auth microservice中的其余API是安全化的
但当我试图通过API网关发送请求时,我得到了以下结果:
可以看到,请求被重定向到正确的微服务(Auth服务),但没有重定向到正确的URL,因为我对显示的其余endpoint和URL有一个异常。
我还尝试将之前生成并发送的授权令牌放入头中,但我得到了相同的未授权令牌
我做错了什么?
也许您需要在zuul或auth微服务中禁用Spring Security。只需删除Spring Security依赖项,确保令牌从zuul传递到auth...
我已经通过添加过滤器解决了这个问题。祖尔构建了完整的类似服务的服务定义的URL PATH,所以我实现了一个删除路径的过滤器,现在请求在其他微服务中被完美地接收。无论如何,我计划改变endpoint定义,使其具有与微服务中定义的endpoint相同的路径,因为对于可变路径,我认为解决这个问题是不可能的。我还将检查使用另一种解决方案,如@Maxim Sagaydachny建议的nginx或清漆
@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;
}
}
非常感谢你。
我正在尝试使用重定向规则设置静态web托管。在我的应用程序中,任何具有前缀api/(http://web.company.com/api)的请求都应该重定向到具有相同前缀(http://api.company.com/api)的另一个主机。我已按以下方式设置路由规则: 但请求没有被正确重定向。控制台中有两个不同的错误: XMLHttpRequest无法加载http://api.company.co
我们有Tomcat 9 Web服务器在生产中。我们面临的问题是,如果Tomcat收到任何格式错误的URL,我们希望显示我们应用程序的自定义错误页面,如下所示 http://URL/| 或 http://URL/[ 我在Tomcat应用服务器的web.xml中添加了错误页面标签,如下所示 我们在tomcat的webapps目录下的应用程序根文件夹中有error.html。 每当用户试图请求任何不存在
例如,我试图向www.testjson发出GET请求。com/json,但响应是从不同的域URL检索的,例如www.testjson。com/confirmJson。 Spring mvc是否支持此功能,特别是restTemplate.exchange功能。 我目前正在做这类事情,但我得到一个500状态码(内部服务器错误),无法找出到底是什么导致了错误。 那么RestTemplate真的可以管理重
在Android WebView中有没有拦截重定向请求的方法?似乎不应该调用InterceptRequest(WebView,WebResourceRequest)! 我希望通过以下方式自动捕获所有web视图请求中的令牌过期: 从服务器发出重定向而不是401 使用shouldOverrideUrlLoading()在需要登录的情况下调用AppAuth 使用shouldInterceptReques
我试图点击一个postendpoint,但它给出了错误302,当我在同一台服务器上尝试另一个get Url时,它给出了200。然后,我使用laxrirectstrategy()重定向了post请求。post请求正在重定向到get请求(只有同一个endpoint的方法名是get和post),它没有从post方法获得响应。有人能告诉我如何使用apahce httpClient 4.5将post请求重定
主要内容:请求转发,重定向,2. 通过 ModelAndView 实现重定向Spring MVC 是对 Servlet 的进一步封装,其本质就是一个 Servlet,因此在 Spring MVC 中也存在转发和重定向的概念。 在 Spring MVC 中,我们可以在逻辑视图名中通过“forward:”和“redirect:”两个关键字来表示转发和重定向。 请求转发 我们可以在控制器方法指定逻辑视图名(View Name)时,使用“forward:”关键字进行请求转发操作。