GAE(Spring Boot App)CORS检查不返回Access-Control-Allow-Origin标头

时间:2018-01-03 16:56:46

标签: java google-app-engine spring-boot cors

我花了一整天的时间尝试将一个Spring Boot应用程序(REST API)部署到Google App Engine,而我却试图通过CORS配置。

spring应用程序在本地工作,所以我知道Spring CORS配置是正确的。

但是,当我部署到GAE时,我收到以下错误。

无法加载https://avian-infusion-156317.appspot.com/api/login:对预检请求的响应未通过访问控制检查:否' Access-Control-Allow-Origin'标头出现在请求的资源上。起源' http://localhost:8100'因此不允许访问。

以下是Chrome开发者工具交换的标题:

一般

Request URL:https://avian-infusion-156317.appspot.com/api/login
Request Method:OPTIONS
Status Code:200 
Remote Address:172.217.26.52:443
Referrer Policy:no-referrer-when-downgrade

请求标题

:authority:avian-infusion-156317.appspot.com
:method:OPTIONS
:path:/api/login
:scheme:https
accept:*/*
accept-encoding:gzip, deflate, br
accept-language:ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
access-control-request-headers:content-type
access-control-request-method:POST
origin:http://localhost:8100
user-agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36

响应标头

allow:GET, HEAD, POST, TRACE, OPTIONS
alt-svc:hq=":443"; ma=2592000; quic=51303431; quic=51303339; quic=51303338; quic=51303337; quic=51303335,quic=":443"; ma=2592000; v="41,39,38,37,35"
content-length:0
content-type:text/html
date:Wed, 03 Jan 2018 16:22:06 GMT
server:Google Frontend
status:200
x-cloud-trace-context:7369ca471aca5fe01fb46903e9af3b9f;o=1

如您所见,标题' Access-Control-Allow-Origin'在回复中缺失。

我在GAE上设置了cors配置如下:

gsutil cors get gs://avian-infusion-156317.appspot.com
[{"maxAgeSeconds": 3600, "method": ["*"], "origin": ["*"], "responseHeader": ["content-type", "authorization"]}]

在诉诸*来源之前,我尝试过特定的网址,即' http://localhost:8100'无济于事。

我错过了什么?请帮忙!

1 个答案:

答案 0 :(得分:0)

我能解决这个问题。事实证明,这与CORS配置无关。我的控制器和REST端点都没有在线。作为Google App Engine的新手,有一件事我完全被误解了。

我有一种错觉,即除了应用程序之外,Google App Engine还拥有自己的CORS层,但事实并非如此。

我比较了quickstart spring boot示例和我的项目,而我失踪的一件事就是ServletInitializer。

var targetNode = document.querySelector('#device\\:emulator-5554 .browsers')

var callback = function(mutationsList) {
  for (var mutation of mutationsList) {
    if (mutation.addedNodes.length) {
      document.querySelector('#device\\:emulator-5554 .action').click();
    }
  }
};

var observer = new MutationObserver(callback);
observer.observe(targetNode, {childList: true});

在与应用程序相同的根包中添加此类使控制器联机。我希望这对其他有类似问题的人有所帮助。