Javascript $http get请求始终返回401 unauthorized-不发送身份验证标头

Javascript $http get请求始终返回401 unauthorized-不发送身份验证标头,javascript,angularjs,http,authentication,http-headers,Javascript,Angularjs,Http,Authentication,Http Headers,我在angularjs中使用以下控制器 app.controller('download-posts-controller',函数($scope,$http){ $http.get('http://localhost:8090/posts', { 标题:{ “授权”:持票人eyJhbGciOiJIUzUxMiJ9.EYJZDWIOIJYXNJYWYOIIXMJMILCJYB2XLIKOIYWRTAW4IFQ.4D9Tudqagiwaooyimn1LV8Y5WVCrif4Raegzfzelse9

我在angularjs中使用以下控制器

app.controller('download-posts-controller',函数($scope,$http){
$http.get('http://localhost:8090/posts', {
标题:{
“授权”:持票人eyJhbGciOiJIUzUxMiJ9.EYJZDWIOIJYXNJYWYOIIXMJMILCJYB2XLIKOIYWRTAW4IFQ.4D9Tudqagiwaooyimn1LV8Y5WVCrif4Raegzfzelse9Diqhmik9WE9x4ESnnecxyAtjxazovpp-m72LpFADA”
}
}).成功(功能(响应){
窗口警报(响应)
});

});确保设置凭据模式:

app.controller('download-posts-controller', function($scope, $http) {
    $http.get('http://localhost:8090/posts', {
        headers: {
            //USE credentials mode
            withCredentials: true,
            'Authorization': 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJQYXNjYWwiLCJ1c2VySWQiOiIxMjMiLCJyb2xlIjoiYWRtaW4ifQ.4D9TUDQAgIWAooyiMN1lV8Y5wVCrIF4rAeGzFzelSE9diqHMik9WE9x4EsNnEcxQXYATjxAZovpp-m72LpFADA'
        }
      //SUCCESS is deprecated, removed from v1.6
      //}).success(function(response){
      }).then(function(response) {
        window.alert(response)
    });
});
有关详细信息,请参阅



这看起来很有希望,但它仍然返回401,根据我的浏览器,请求中不存在标题。它总是说请求方法也是可选的

来自浏览器的选项请求是

在中,将发送带有选项方法的飞行前请求,以便服务器可以响应是否可以发送请求。标头作为飞行前请求的一部分通知服务器,当发送实际请求时,将使用指定的请求方法发送该请求。标头通知服务器,当发送实际请求时,将使用指定的标头发送请求。然后,服务器有机会确定在这些情况下是否希望接受请求

服务器会做出响应,指定查询相关资源的可行方法


防止恶意网站使用用户的位置和凭据进行恶意操作。允许服务器允许浏览器在这些请求无害时放宽该策略。

好的,我最终发现跨源(CORS)请求首先发送一个选项请求,以确保允许用户请求。 现在…我的api后端中有一些逻辑,可以过滤所有传入的HTTP并检查是否存在包含令牌的授权头(在所有情况下,uri包含“/auth/**”时除外)。当执行初始选项请求时,我提供的auth标头中的令牌不会被包括在内,因为浏览器首先会等待,直到选项返回表示我可以发出此请求……因此,服务器上会引发异常,因为选项请求未使用令牌验证

修复…我只是检查了“选项”HTTP方法,在本例中忽略了auth。简单。 谢谢大家帮助解决这个问题。最后,它只需要大量的调试


我希望这可能有助于指导其他至少一个遇到类似问题的人。

您是否在API控制器的任何位置返回
401
状态代码确保您的令牌有效,我确实在服务器上收到401,同样的令牌是绝对有效的,因为它是我用于开发的非过期令牌,我可以在postman中或从我的android应用程序(或apache wicket等效于我的网站,因为我刚刚迁移到angular)将其用于相同的请求它给了我预期的响应。我能让它发出实际get而不是不需要的选项请求的唯一方法是从请求中删除头组件。然后,我尝试了一个http拦截器来添加头,但也不起作用。这看起来很有希望,但它仍然返回401,根据我的浏览器,请求中不存在头。它总是说请求方法也是OPTIONS(即使我将url更改为stackoverflow.com——尽管我在这里得到301)。你知道为什么吗?我刚刚调试了服务器,以确认从angular page发送的请求中从未包含标头,但我通过任何其他方法发出相同的请求,并且包含标头