AngularJS Post请求在firefox上无法正常工作

时间:2016-08-23 05:42:37

标签: javascript angularjs http firefox

我正在使用AngularJS编写一个网站,该网站与服务器上的API通信并提供一些信息。 登录部分我应该发送一个包含电子邮件,密码等的http帖子请求。它在谷歌Chrome和IE上工作正常。我的意思是它发送post请求并获取令牌。但是在FireFox中我检查了网络,它发送了一个OPTION请求并获得了200但是之后它没有发送任何帖子!因此我的登录不会消失,我也不会得到任何令牌。

我应该为这种情况做些什么?

App.config:

  $httpProvider.defaults.withCredentials = true;
  $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8;';
  $httpProvider.interceptors.push('httpRequestInterceptor');

发送请求的服务功能:

    this.loginEmail = function(f_email, f_pass, deviceModel, deviceOs) {
    var data = $.param({
            email: f_email,
            password: f_pass,
            device_model: deviceModel,
            device_os: deviceOs
        });

        return $http({
            method: "POST",
            url: app.baseUrl + 'login_email/' + app.storeID + '/' + app.device_id,
            data: data
        }).success(function(response){
            return response.status;
        });
    /*return $http.post(app.baseUrl + 'login_email/' + app.storeID + '/' + app.device_id, data).success(function(response){
        return response.status;
    }).error(function(response){
        return response.status;
    });*/
};

服务器凭据为真

CORS似乎很好,因为我可以得到请求

enter image description here

编辑: 这是另一件可能与此问题有关的事情: 在Chrome中,当我登录获取请求时,它会发送令牌标头 但是对于Post它没有

httpRequestInterceptor:

app.factory('httpRequestInterceptor', function ($cookieStore) {
     return {
        request: function (config) {

        config.headers['Authorization'] = $cookieStore.get('Auth-Key');;
        config.headers['Accept'] = 'application/json;odata=verbose';
        return config;
     }
   };
});

1 个答案:

答案 0 :(得分:1)

问题是由apache配置引起的。

之前:

Access-Control-Allow-Headers: "authorization"

后:

Access-Control-Allow-Headers: "authorization, Content-type"

更新:

在CORS请求中,如果API需要一些特殊标头,如Auhtorization Token,则必须返回所有OPTIONS请求200(ok!),否则无论如何上述解决方案都无法正常工作。 这是代码:

if($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
   header( "HTTP/1.1 200 OK" );
   exit();
}

更新2: 这个OPTIONS问题发生在Django的REST框架中!对于OPTIONS,它会通过追求整个api来评估请求,如果它有问题,即使你有发送请求所需的权限,你也会收到错误!

示例:

假设有一个像api / profile这样的网址需要一个Authorization标头来响应个人资料详细信息。您想发送跨域请求以获取它。您设置了正确的标题并单击!您将收到未经授权的错误!为什么?由于预先发出的请求(OPTIONS)不包含任何特殊标头并且浏览器将其发送到服务器,因此具有REST框架的服务器通过检查整个请求(具有授权标头的get请求)来评估OPTIONS请求,但OPTIONS没有任何请求授权标题,因此此请求未经授权!

发展解决方案: 此问题可以通过客户端或后端解决。前端开发人员可以在chrome上安装以下插件:

  

Allow-Control-Allow-Origin:*

后端开发人员可以安装一个在Django Framework上启用CORS的软件包。