解决Elasticsearch相关CORS问题
运行环境
我用Java编写了一个带有Elastic Search的后端,并使用Maven进行构建和管理。
部署的运行环境是基于Google Cloud Platform(GCP)的。我在此环境中使用Google的Elasticsearch API,并将API部署到Google App Engine (GAE)上。此外,我也在本地环境中运行和测试。
问题描述
在我运行应用程序和进行开发的过程中,我遇到了一个有趣的问题。当我在本地运行应用程序时,一切都正常,没有出现任何错误。然而,当我尝试通过前端访问部署在GCP上的项目时,我遇到了一个报错:
Access to fetch at 'https://XXX.aosnot.com/authenticate/guest' from origin 'https://master.XXX.amolifyapp.com' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
这是一个典型的CORS(跨域资源共享)错误,看起来似乎是由于我的应用程序试图从一个源(https://master.XXX.amolifyapp.com
)访问另一个源(https://XXX.aosnot.com/authenticate/guest
),但后者没有设置正确的CORS策略来允许这种访问。
然而,我发现这个问题实际上并非由CORS问题引起的,而是由于Elasticsearch服务的问题。
前提
当你接下来阅读的时候,请保证你已经完成了基本的CORS配置,例如proxy server, 或后端的CORS filter,或package.json的proxy设置(如果你现在正在处于本地开发环境并且使用reactJS)等等...确保不是你真的没有设置CORS!
解决方案
通过深入调查,我发现当我的Elasticsearch账号出现问题(例如密码错误),或者Elasticsearch服务下线时,整个应用程序都会崩溃,甚至会影响到与Elasticsearch无关的部分,比如登录和注册功能。此时,浏览器会显示出CORS错误,但这只是因为Elasticsearch服务没有正常响应,而不是因为存在真正的CORS问题。
是滴,你没有看错,尽管这种情况真的很少,但是本次报CORS错和真正的问题没有关系。
因此,解决这个问题的方法是检查Elasticsearch账号,并确保Elasticsearch服务处于运行状态。我需要确保我使用的Elasticsearch账号密码正确,没有被锁定或禁用。此外,我还需要确保Elasticsearch服务正在运行,没有下线或由于其他原因而不可用。
通过这种方法,我成功解决了这个问题,并使我的应用程序能够正常工作。我希望这篇文章能帮助到遇到类似问题的其他开发者。
可能原因分析(不确定)
这种错误的报CORS的报错信息往往是使用的API的内部没有handle一些问题导致的,在我的情况,可能是Elastic Search API,GAE,GCP,Maven,甚至可能是Chrome的问题,但是无法确定是哪一部分导致了错误报错。
对于开发者来说的建议
添加错误处理。比如说我的场景,就应该考虑到API不work的情况,开发的时候多多考虑,增加程序鲁棒性,就算像这样碰到特别小概率的corner case,也不会被这种莫名其妙的问题坏了一整个程序。