Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 向主干中的标头添加访问令牌的问题:它更改了方法_Javascript_Ajax_Backbone.js - Fatal编程技术网

Javascript 向主干中的标头添加访问令牌的问题:它更改了方法

Javascript 向主干中的标头添加访问令牌的问题:它更改了方法,javascript,ajax,backbone.js,Javascript,Ajax,Backbone.js,我使用主干网从API获取数据。当不需要授权时,这一切都可以正常工作,当我将授权添加到API时,我会得到预期的401-未授权响应 [从控制台日志: GET http://localhost:999/api/tasks 401 (Unauthorized) ] 然后,我添加了这段代码,为每个呼叫的报头添加承载授权: var backboneSync = Backbone.sync; Backbone.sync = function (method, model, options) {

我使用主干网从API获取数据。当不需要授权时,这一切都可以正常工作,当我将授权添加到API时,我会得到预期的401-未授权响应

[从控制台日志:

GET http://localhost:999/api/tasks 401 (Unauthorized) 
]

然后,我添加了这段代码,为每个呼叫的报头添加承载授权:

var backboneSync = Backbone.sync;

Backbone.sync = function (method, model, options) {
    /*
     * The jQuery `ajax` method includes a 'headers' option
     * which lets you set any headers you like
     */

    var theUser = JSON.parse(localStorage.getItem("happuser"));

    if (theUser !== null)
    {
        var new_options =  _.extend({
            beforeSend: function(xhr) {
                var token = 'Bearer' + theUser.authtoken;
                console.log('token', token);
                if (token) xhr.setRequestHeader('Authorization', token);
            }
        }, options) 
    }

    /*
     * Call the stored original Backbone.sync method with
     * extra headers argument added
     */
    backboneSync(method, model, new_options);
};
一旦我包含了这段代码,API就用一个OPTIONS方法而不是GET方法发送请求,我显然得到了一个405无效方法响应

这是控制台日志输出

OPTIONS http://localhost:999/api/tasks 405 (Method Not Allowed) jquery-1.7.2.min.js:4
OPTIONS http://localhost:999/api/tasks Invalid HTTP status code 405 
知道为什么发送方法会改变吗

其他发现:

它在我创建模型时出现。保存时也会执行相同的操作,即使我实际上没有更改模型

进一步详情:这是未经授权的呼叫请求/响应

Request URL:http://localhost:999/api/tasks
Request Method:GET
Status Code:200 OK
Request Headersview source
Accept:application/json, text/javascript, */*; q=0.01
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
Host:localhost:999
Origin:http://localhost
Proxy-Connection:keep-alive
Referer:http://localhost/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)     Chrome/30.0.1599.101 Safari/537.36

Response Headersview source
Access-Control-Allow-Headers:*
Access-Control-Allow-Methods:GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Origin:http://localhost
Cache-Control:no-cache
Content-Length:3265
Content-Type:application/json; charset=utf-8
Date:Wed, 13 Nov 2013 14:51:32 GMT
Expires:-1
Pragma:no-cache
Server:Microsoft-IIS/7.5
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET
一旦我在响应中添加同步覆盖代码,就会对此进行更改:

Request URL:http://localhost:999/api/tasks
Request Method:OPTIONS
Status Code:405 Method Not Allowed
Request Headersview source
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
Access-Control-Request-Headers:accept, authorization
Access-Control-Request-Method:GET
Host:localhost:999
Origin:http://localhost
Proxy-Connection:keep-alive
Referer:http://localhost/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36

Response Headersview source
Access-Control-Allow-Headers:*
Access-Control-Allow-Methods:GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Origin:http://localhost
Allow:GET,POST
Cache-Control:no-cache
Content-Length:76
Content-Type:application/json; charset=utf-8
Date:Wed, 13 Nov 2013 14:56:52 GMT
Expires:-1
Pragma:no-cache
Server:Microsoft-IIS/7.5
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET

您似乎正在发布一个“”:

  • 你在向CORS提出请求
  • 您正在设置自定义标题
在这种情况下,浏览器将请求分为两部分:飞行前请求(您看到的选项动词)和检索权限后的实际请求

引用链接文章:

飞行前请求是作为HTTP选项请求发出的(因此请确保 您的服务器能够响应此方法)。它还包含一些 其他标题:

访问控制请求方法-实际请求的HTTP方法。 始终包含此请求头,即使HTTP方法是 前面定义的简单HTTP方法(GET、POST、HEAD)

访问控制请求标头-以逗号分隔的非简单 请求中包含的标题

飞行前请求是为实际飞行请求权限的一种方式 请求,然后再提出实际请求。服务器应该检查 上面的两个标头用于验证HTTP方法和 请求的标头有效且已接受


我会尝试的第一件事是重命名您的
选项
变量,并查看该方法是否更改为新的变量名。在backbone.sync方法本身中?我可能删除了太多内容,但它似乎可以@BenDrury yes工作,尽管这需要一个新的变量;e、 g.
var foo=选项
并使用
foo
作为
的第二个参数。extend
。我的意思是,方法被更改为OPTIONS,这是传入的变量的名称。如果它发送FOO作为方法,那么这就是问题所在。如何修复它将是另一个问题,尽管…@Harryott…,但它仍然是选项,不会更改为新的变量名,所以这不是问题所在。好的。这是有道理的。。。谢谢我会找到解决办法的。如果我不修改选项,它怎么可以作为CORS请求正常工作呢?因为如果不设置自定义头,请求就不会被预引导(请参阅本文中的处理简单请求)。如果可以的话,修复方法可能是支持服务器端的选项。