XMLHttpRequest无法加载' URL'。预检的响应包含无效的HTTP状态代码401

时间:2016-07-12 09:07:42

标签: angularjs ionic-framework http-status-code-401 preflight

我研究离子。并得到了这个错误。这是我的app.js:

var app = angular.module('eMoMo', ['ionic', 'ngCordova'])
.config(['$httpProvider', function ($httpProvider) {
       //Reset headers to avoid OPTIONS request (aka preflight)
       $httpProvider.defaults.headers.common = {};
       $httpProvider.defaults.headers.post = {};
       $httpProvider.defaults.headers.get = {};
       $httpProvider.defaults.headers.delete = {};
       $httpProvider.defaults.headers.put = {};
       $httpProvider.defaults.headers.patch = {};
       $httpProvider.defaults.headers.common['Access-Control-Allow-Headers'] = '*';                                     
       //$httpProvider.defaults.headers.common['Authorization'] = 'Basic ' + btoa(my_id+ ':' + my_pass")
   }]);

app.controller('MainViewController',  function($scope, $http) {
  $http({
    method:"GET",
    url: "my_url"
      headers: {
        'content-type': 'application/x-www-form-urlencoded; charset=utf-8',
        'authorization': 'Basic ' + btoa('my_username' + ':' + 'my_pass')
        'access-control-allow-origin': '*'
    }
  }).then(function(categories){
    console.log(categories);
  });

});

app.run(function($ionicPlatform) {
  $ionicPlatform.ready(function() {
    if(window.cordova && window.cordova.plugins.Keyboard) {
      cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
      cordova.plugins.Keyboard.disableScroll(true);
    }
    if(window.StatusBar) {
      StatusBar.styleDefault();
    }
  });
}

我尝试研究,它与CORS有关,但是我已经安装了一个chrome的插件来禁用该错误。我怎么解决这个问题。 ?

2 个答案:

答案 0 :(得分:0)

由于您要添加自定义标头,因此您正在触发preflight request。据推测,您的插件只会在Chrome处理之前将Access-Control-Allow-Origin: *粘贴到响应中。当服务器响应带有错误的OPTIONS请求时,这没有用。

您有四种选择:

  1. 确保服务器位于同一个源,因此您不需要CORS(这可能涉及设置更能反映您的实时环境的开发服务器)。
  2. 让服务器支持CORS
  3. 找一个可以处理预检请求的插件(或修复现有的请求)
  4. 更改您的代码,使其不会生成预检请求
  5. 选项4的起点是删除:

    $httpProvider.defaults.headers.common['Access-Control-Allow-Headers'] = '*';                                     
    

    'access-control-allow-origin': '*'
    

    ...因为Access-Control-Allow-Origin和Access-Control-Allow-Headers是响应标题,对请求完全没有意义。

    您可能仍会遇到手动添加授权标题的问题。

答案 1 :(得分:-1)

通常401与未经授权的请求有关。

  1. 请验证您的密码和用户名,
  2. 如果两者都正确,那么destiantion服务器不接受您的用户名和密码的btoa编码。尝试BaseConverter64编码