当前位置: 首页 > 知识库问答 >
问题:

Spring boot zuul请求重定向错误

微生德泽
2023-03-14

我正在开发一个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有一个异常。

我还尝试将之前生成并发送的授权令牌放入头中,但我得到了相同的未授权令牌

我做错了什么?

共有2个答案

汝和裕
2023-03-14

也许您需要在zuul或auth微服务中禁用Spring Security。只需删除Spring Security依赖项,确保令牌从zuul传递到auth...

凤高翰
2023-03-14

我已经通过添加过滤器解决了这个问题。祖尔构建了完整的类似服务的服务定义的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:”关键字进行请求转发操作。