即使在发送CORS标头

时间:2018-03-31 23:05:10

标签: angularjs playframework cors

我有一个使用Play Framework / Java开发的REST API,以及在Angular JS中开发的前端。

我正在尝试使用以下代码将Angular Client的POST方法调用到服务器:

$scope.login = function () {
console.log('login called');
var loginURL = 'http://localhost:9000/login';
var loginInfo = {
    'email': $scope.email,
    'password': $scope.password
};

$http({
    url: loginURL,
    method: 'POST',
    data: loginInfo,
    headers: { 'Content-Type': 'application/json' }
}).then(function (response) {
    console.log('SUCCESS: ' + JSON.stringify(response));
    $scope.greeting = response.status;
}, function (response) {
    console.log('ERROR: ' + JSON.stringify(response));
});
}

这是我服务器上的代码:

public Result doLogin() {
    ObjectNode result = Json.newObject();
    result.put("status", "success");
    return ok(result).withHeader("Access-Control-Allow-Origin", "*");
}

这是应用程序配置文件:

#allow all hosts.
play.filter.hosts {
    allowed = ["."]
}

#allow CORS requests.
play.filters.cors {
  allowedOrigins = ["*"]
}

然而,即使在启用CORS之后,我在Firefox和谷歌浏览器的控制台中也出现错误:

  

阻止跨源请求:同源策略禁止在http://localhost:9000/login读取远程资源。 (原因:缺少CORS标题'Access-Control-Allow-Origin')。       错误:{"数据":null,"状态": - 1," config":{"方法":" POST& #34;" transformRequest":[空]," transformResponse":[空]," jsonpCallbackParam":"回调"&# 34; URL":" http://localhost:9000/login""数据" {"电子邮件":" XXX",& #34;密码":" XXX"}"头" {"内容类型":"应用/ JSON&#34 ;, "接受":" application / json,text / plain, / "}}," statusText":"& #34;}

我知道服务器正在发送正确的响应和正确的标头,因为当我从Postman执行POST时,我可以看到响应以及包含{" Access-Control-Allow-Origin&#的标头邮差中的34;," *"}。

那么,那可能是什么问题呢?客户端是否有一些我遗漏的东西?

1 个答案:

答案 0 :(得分:-1)

POSTMAN请求和浏览器请求之间的区别是浏览器在实际的POST / GET请求之前发送OPTIONS请求。

能够接受播放框架中的OPTION请求allowedHttpMethods = [" GET"," POST" " OPTIONS"] 请点击此链接 Play Framework 2.3 - CORS Headers

这会导致从框架(如angularjs)访问CORS请求时出现问题。找到请求的选项并正确采取行动变得困难或框架。

要解决问题,您需要分析选项请求的进行方式以及解释方式和解决方法。但总的来说,我建议使用" fetch"内置的请求,支持promise,因此可以使用angularjs代码轻松链接

所以你的代码看起来像这样

    $scope.login = function () {
  console.log('login called');
  var loginURL = 'http://localhost:9000/login';
  var loginInfo = {
      'email': $scope.email,
      'password': $scope.password
  };
fetch(loginURL, {
  method: 'post',
  headers: {
      "Content-type": "application/json"
  },
  body: loginInfo
}).then(function (response) {
  console.log('SUCCESS: ' + JSON.stringify(response));
  $scope.greeting = response.status;
}, function (response) {
  console.log('ERROR: ' + JSON.stringify(response));
});
}