gpt4 book ai didi

javascript - AngularJS:$http.post 请求之前的 OPTIONS 预检调用

转载 作者:IT王子 更新时间:2023-10-29 03:22:18 26 4
gpt4 key购买 nike

我正在使用 AngularJS v1.2.4。

我在 Angular 发送预检 OPTIONS 调用时遇到问题(Chrome 将 OPTIONS 调用显示为“已取消”)并通过以下方式解决了这个问题:

$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];

这适用于我所有的 $resource 调用,一切都很好。

现在我正在尝试实现身份验证,以及一个登录页面,该页面使用用户的凭据向我的服务器发送 POST 请求。我看到了我之前遇到的问题,但 $resource 调用仍然工作正常。

真正令人沮丧的是问题时断时续地发生;我将更改 header 周围的一些选项,然后它会工作一段时间,然后在不更改任何代码的情况下再次停止工作。

我的服务器配置为 CORS,可以与 curl 和其他 REST 客户端一起正常工作。这是一个例子:

curl -X OPTIONS -ik 'https://localhost:3001/authenticate' -H "Origin: https://localhost:8001"
HTTP/1.1 200 OK
content-type: application/json; charset=utf-8
content-length: 2
cache-control: no-cache
access-control-allow-origin: *
access-control-max-age: 86400
access-control-allow-methods: GET, HEAD, POST, PUT, DELETE, OPTIONS
access-control-allow-headers: Authorization, Content-Type, If-None-Match, Access-Control-Allow-Headers, Content-Type
access-control-expose-headers: WWW-Authenticate, Server-Authorization
set-cookie: session=Fe26.2**94705d49717d1273197ae86ce6661775627d7c6066547b757118c90c056e393b*2KYqhATojPoQhpB2OwhDwg*W9GsJjK-F-UPqIIHTBHHZx1RXipo0zvr97_LtTLMscRkKqLqr8H6WiGd2kczVwL5M25FBlB1su0JZllq2QB-9w**5510263d744a9d5dc879a89b314f6379d17a39610d70017d60acef01fa63ec10*pkC9zEOJTY_skGhb4corYRGkUNGJUr8m5O1US2YhaRE; Secure; Path=/
Date: Wed, 18 Dec 2013 23:35:56 GMT
Connection: keep-alive

这是 $http.post 调用:

var authRequest = $http.post('https://' + $location.host() + ':3001/authenticate', {email: email, password: password});

当来 self 的应用程序的调用正常时,OPTIONS 请求是这样的:

enter image description here

当它不起作用时,这是OPTIONS请求:

enter image description here

看起来缺少了一大堆 header 属性。有没有人遇到过类似的问题?

编辑:

澄清一下,当它不起作用时,请求永远不会到达服务器 - 它会立即在浏览器中中止。

enter image description here

在 Firebug 中,请求 header 是:

OPTIONS /authenticate HTTP/1.1
Host: localhost:3001
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:25.0) Gecko/20100101 Firefox/25.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.91,en-GB;q=0.82,fr-FR;q=0.73,fr;q=0.64,utf-8;q=0.55,utf;q=0.45,de-DE;q=0.36,de;q=0.27,en-sg;q=0.18,en-ca;q=0.09
Accept-Encoding: gzip, deflate
Origin: https://localhost:8001
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Proxy-Authorization: Basic cGF0cmljZUB6b25nLmNvbTpjaGFuZ2VtZQ==
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

enter image description here

更新:

我认为,通过将主机更改为不存在的服务器,我已经排除了服务器出现问题的可能性。仍然看到相同的行为。

这是一些代码:

App.services.factory('AuthService', function ($http, $location, $q) {

var currentUser;

return {
authenticate: function (email, password) {

//promise to return
var deferred = $q.defer();

var authRequest = $http.post('https://this.does.not.exist.com:3001/authenticate', {email: email, password: password});

authRequest.success(function (data, status, header, config) {
currentUser = data;
console.log('currentUser in service set to:');
console.log(currentUser);
//resolve promise
deferred.resolve();
});

authRequest.error(function (data, status, header, config) {
console.log('authentication error');
console.log(status);
console.log(data);
console.log(header);
console.log(config);

//reject promise
deferred.reject('authentication failed..');
});

return deferred.promise;
},
isAuthenticated: function () {
return currentUser !== undefined;
}
};
});

和 HTTP 配置:

App.config(['$httpProvider', function ($httpProvider) {

$httpProvider.defaults.useXDomain = true;
//$httpProvider.defaults.headers.common = {};

console.log('logging out headers');
console.log($httpProvider.defaults);
console.log($httpProvider.defaults.headers.common);
console.log($httpProvider.defaults.headers.post);
console.log($httpProvider.defaults.headers.put);
console.log($httpProvider.defaults.headers.patch);
console.log('end logging out headers');

$httpProvider.defaults.headers.common = {Accept: "application/json, text/plain, */*"};
$httpProvider.defaults.headers.post = {"Content-Type": "application/json;charset=utf-8"};

console.log('after: logging out headers');
console.log($httpProvider.defaults.headers.common);
console.log($httpProvider.defaults.headers.post);
console.log($httpProvider.defaults.headers.put);
console.log($httpProvider.defaults.headers.patch);
console.log('after: end logging out headers');

$httpProvider.interceptors.push(function ($location, $injector) {
return {
'request': function (config) {

console.log('in request interceptor!');

var path = $location.path();
console.log('request: ' + path);

//injected manually to get around circular dependency problem.
var AuthService = $injector.get('AuthService');
console.log(AuthService);
console.log(config);

if (!AuthService.isAuthenticated() && $location.path() != '/login') {
console.log('user is not logged in.');
$location.path('/login');
}

//add headers
console.log(config.headers);
return config;
}
};
});
}]);

最佳答案

这感觉可能与您在本地主机上访问 https 端点这一事实有关。这意味着您可能正在使用某种自签名 SSL 证书,这可能意味着 Chrome 认为它不受信任。

我首先会尝试直接转到/authenticate 端点,看看 Chrome 是否会向您发出有关证书不受信任的警告。看看接受该警告是否有效。

否则,当您在本地进行测试时,您可以只点击一个 http 端点,看看是否能解决问题?

关于javascript - AngularJS:$http.post 请求之前的 OPTIONS 预检调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20671619/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com