setRequestHeader("Connection","close")报错

 

  • 问题产生:

    今天在看前人留下的代码,走到ajax总是会报错:Refused to set unsafe header "Connection"

 

  • 初步调研:

    网上调查一番发现,chrome不支持一部分请求头的setRequestHeader。

                所以前人没关注这个错误,大概是因为系统主要是在 IE 里面运行的吧。

 

  • 贴上代码:

        xmlRequest.open(this.method, url, this.async);
        xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xmlRequest.setRequestHeader("RequestType", "AJAX");
        if(this.closeConnection){
            xmlRequest.setRequestHeader("Connection", "close");   // 报错语句 Refused to set unsafe header:"Connection"
        }

        xmlRequest.send(sendContent);

 

  • 查询 setRequestHeader:

      1. 网友回复:供参考,点击传送

          文章回复是英文,翻译过来是(部分翻译可能不是很准确,望求指点):

        XMLHttpRequest isn't allowed to set these headers, they are being set automatically by the browser. The reason is that by manipulating these headers you might be able to trick the server into accepting a second request through the same connection, one that wouldn't go through the usual security checks - that would be a security vulnerability in the browser.

             XHR请求不允许设置这些header,浏览器会自动设置。因为允许你操作这些 header 意味着你可以骗过浏览器进行二次连接,而这个二次连接不会进行安全检查,这种情况会在浏览器中造成安全隐患。

        2. w3c 标准说明:

          (w3school 中对 XMLHttpRequest 的详细说明) 点击传送

           (WHATWG 上查到的相关文档)点击传送

     贴出 WHATWG 上列出的不能设置的 header

 

A forbidden header name is a header name that is a byte-case-insensitive match for one of

  • `Accept-Charset`    用来告知(服务器)客户端可以处理的字符集类型。借助内容协商机制,服务器可以从诸多备选项中选择一项进行应用, 并使用Content-Type 应答头通知客户端它的选择。浏览器通常不会设置此项值。
  • `Accept-Encoding`     浏览器发给服务器,声明浏览器支持的编码类型。

         示例:    

              Accept-Encoding: gzip, deflate, sdch, br

          示例:

             Access-Control-Request-Headers: X-PINGOTHER, Content-Type

          示例:

             Access-Control-Request-Method: POST

  • `Connection`    客户端和服务器通信时对于长链接如何处理。

          示例:

             Connection: keep-alive

  • `Content-Length`     浏览器实体主体的大小。
  • `Cookie`    cookie信息。
  • `Cookie2`      已被淘汰,现在多使用 Cookie。
  • `Date`    当前的 GMT 时间。
  • `DNT`    禁止追踪 Do Not Track。
  • `Expect`    表示服务器只有在满足此期望条件的情况下才能妥善的处理请求。

                示例:Expect: 100-continue

                回复:100(continue);417(expectation failed)

  • `Host`      指定请求服务器的域名/IP+端口号。
  • `Keep-Alive`     允许消息发送者暗示连接的状态,还可以用来设置超时时长和最大请求数,在设置Connection:keep-alive之后才有意义。

 

 

                示例:Keep-Alive: timeout=5, max=1000

 

 

  • `Origin`      指示了请求来自哪个站点。
  • `Referer`      包含了当前请求页面的来源页面的地址。
  • `TE`     TE请求型头部用来指定用户代理希望使用的传输代码类型。Accept-Transfer-Encoding
  • `Trailer`      允许发送方在分块发送的消息后面添加额外的元信息,这些元信息可能是随着消息主体的发送动态生成的,比如消息的完整校验,消息的数字签名,或者消息经过处理后的最终状态等。
  • `Transfer-Encoding`     是一个逐跳传输消息首部,即仅用于两个节点之间的消息传递,而不是所请求的资源本身。
  • `Upgrade`      向服务器指定某种传输协议以便服务器进行转换。
  • `Via`       是一个通用首部,由代理服务器添加,适用于正向和反向代理,在请求和响应中均可出现。可以用来追踪消息转发情况,防止循环请求,以及识别在请求或响应传递链中消息发送者对于协议的支持能力。
  • `User-Agent`( 不包含在文档中,但在其他资料有这个,测试也证实不能设置 )      用户代理,可用来判断浏览器类型。

   (参考网站有:MDN,w3school,WHATWG等)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值