解决swagger死循环的问题,/null/swagger-resources/configuration/ui

swagger在很长一段时间不访问之后,再访问会出现下面这个(猜测是session过期),如果不做任何处理,这个页面会频繁访问:http://xxx.xxx.com/null/swagger-resources/configuration/ui,因为是死循环,访问量能把服务撑爆了。特别是前端开发人员第二天来上班的时候,并没有打开swagger这页面,它仍然会不停的访问,一开始都很难定位到问题。

可以看到/null/swagger-resources/configuration/ui这个请求远远的高于其他请求,剩下/swagger-resources/**也是跟它相关的(我开始在代码中做了重定向,后面发现没用)。

之前在网上搜过这个问题的解决方案,有的人说是因为资源找不到,重复请求,于是我重定向到指定资源,如下:

/**
     * 解决swagger死循环问题
     * 下面这几个地址会一直轮询,改为重定向
     * /null/swagger-resources/configuration/ui
     * /null/swagger-resources/configuration/security
     * /null/swagger-resources
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addRedirectViewController("/null/api-docs",
                "/api-docs").setKeepQueryParams(true);
        registry.addRedirectViewController("/null/swagger-resources/configuration/ui",
                "/swagger-resources/configuration/ui");
        registry.addRedirectViewController("/null/swagger-resources/configuration/security",
                "/swagger-resources/configuration/security");
        registry.addRedirectViewController("/null/swagger-resources", "/swagger-resources");
    }

然而并没有什么用,仍然还是不断请求。网上还有说是swagger版本问题,需要spring-swagger和spring-swagger-ui版本一致,我检查了也是一致的。

最后想到一个简单粗暴的解决方案,因为/null/swagger-resources/configuration/ui明显不是一个正常的请求,我可以在请求经过nginx的时候就过滤掉。

解决方案:

        location ^~ /null/ {
           deny all;
        }

完整配置:

    server{
        listen       80;
        server_name  xxx.xxx.com;

        # 加上这句即可,把/null的请求全部拒绝掉
        location ^~ /null/ {
           deny all;
        }

        location / {
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_pass http://api-server/;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

不过还是希望swagger官方未来能解决这个问题,或者有人找到更好的解决方案的话,可以在下面评论。


版权声明:本文为wjf8882300原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。