ajax中的setRequestHeader设置请求头

1、问题引发点:

前不久发现一个问题: 前端并没有设置请求头信息里面的Accept-Encoding:gzip...但是在请求头中可以明显的看到Accept-Encoding:gzip, deflate, sdch,并且我尝试修改这个请求头,发现 不 生 效;

2、XMLHttpRequest对象提供了一个设置请求头的方法:setRequestHeader,对应的jQuery可以再beforeSend回调里面设置请求头:

$.ajax({
    type: "GET",
    url: "test.php",
    success: function(data) {
        console.log(data);
    },
    beforeSend: function(xhr) {
        xhr.setRequestHeader("User-Agent", "headertest");
    }
});

3、后来看W3C标准文档发现,这个请求头不是什么都可以设置的,标准里面明确规定了以下请求头信息是浏览器控制,开发者不允许设置这些请求头

Terminate these steps if header is a case-insensitive match for one of the following headers:

  • Accept-Charset
  • Accept-Encoding
  • Access-Control-Request-Headers
  • Access-Control-Request-Method
  • Connection
  • Content-Length
  • Cookie
  • Cookie2
  • Date
  • DNT
  • Expect
  • Host
  • Keep-Alive
  • Origin
  • Referer
  • TE
  • Trailer
  • Transfer-Encoding
  • Upgrade
  • User-Agent
  • Via

… or if the start of header is a case-insensitive match for Proxy- or Sec- (including when header is just Proxy- or Sec-).

The above headers are controlled by the user agent to let it control those aspects of transport. This guarantees data integrity to some extent. Header names starting with Sec- are not allowed to be set to allow new headers to be minted that are guaranteed not to come fromXMLHttpRequest.

4、例子:

testAE.html

<!DOCTYPE html>
<html>
<head>
	<title>test</title>
</head>
<script type="text/javascript" src="./jquery.1.8.1.min.js"></script>
<body>
<script type="text/javascript">
$.ajax({
    type: "GET",
    url: "./testAE.php",
    success: function(data) {
        $("body").append(data);
    },
    beforeSend: function(xhr) {
        xhr.setRequestHeader("Accept-Encoding", "testAE");
    }
});
</script>
</body>
</html>

testAE.php

<?php
/*回传ACCEPT_ENCODING*/
echo $_SERVER[‘HTTP_ACCEPT_ENCODING‘];
?>

chrome:

ie:

控制台:

可以看到jQuery也会提示你这样设置是不安全的。

在mozila官方论坛里面也有相应的讨论:Ajax setRequestHeader;

时间: 2024-08-07 16:24:51

ajax中的setRequestHeader设置请求头的相关文章

JavaScript之ajax的作用、流程以及如何设置请求头

什么是ajax?它的作用是什么?它的流程好处又有那些?如何设置请求头呢????????(嘻嘻,不知道请往下看哦): 1)什么是ajax呢? ajax即"Asynchronous Javascript And XML"(异步的JavaScript和xml),是指一种创建交互式网页应用的网页开发技术. 2)ajax的作用又是什么呢? 通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 通俗的来讲:它是一种

设置请求头信息的不同方式

原文:http://blog.csdn.net/magiclr/article/details/49643277 在AngularJs中有三种方式可以设置请求头信息: 1.在http服务的在服务端发送请求时,也就是调用http()方法时,在config对象中设置请求头信息: $http.post('/somePath' , someData , { headers : {'Authorization' : authToken} }).success(function(data, status,

axios设置请求头内容

axios设置请求头中的Authorization 和 cookie 信息: GET请求 axios.get(urlString, { headers: { 'Authorization': 'Bearer ' + token, "Cookie" : 'sessionId=' + sessionId + '; recId=' + recId, ... }, params: { param1: string, param2: string }, ... } ) .then(res =&g

AJAX中出现两次请求,OPTIONS请求和GET请求

在项目中发现ajax中出现两次请求,OPTIONS请求和GET请求,得到的数据出错,所以想要去掉OPTIONS请求. ajax请求如下: ajaxRequestGet: function (lastPath, requestParams, successFun) { $.ajax({ headers: { 'GISTTOKEN': getToken() }, url : this.baseUrl+lastPath, type : "get", data: requestParams,

设置请求头解决浏览器同源问题

思想: 添加过滤器 设置请求头 代码如下 package com.deppon.vas.common.framework.cors; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servl

利用volley进行http设置请求头、超时及请求参数设置(post)

这里以post请求说明,get请求相似设置请求头及超时. 1.自定义request,继承com.android.volley.Request 2.构造方法实现(basecallback,为自定义的监听,实现Response.Listener,ErrorListener接口)--post请求 public BaseRequest(String url,String params, BaseCallback<T> callback)      {   super(Method.POST, url,

Django框架 之 基于Ajax中csrf跨站请求伪造

ajax中csrf跨站请求伪造 方式一 1 2 3 $.ajaxSetup({     data: {csrfmiddlewaretoken: '{{ csrf_token }}' }, }); 方式二 1 2 3 4 5 <form> {% csrf_token %} </form><br><br><br>$.ajax({<br>...<br>data:{ "csrfmiddlewaretoken":

AFN Post方法 设置请求头(json)

设置请求头:[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; GET方法设置请求头的时候没什么问题:但是使用POST方法时设置无效,使用其他方法都没用,后来发现没有序列化 manager.requestSerializer = [AFJSONRequestSerializer serializer]; 注意: 和manager.re

axios设置请求头失效的问题

前言:因为在使用vue-element-admin框架时遇到了设置请求头失效的问题,在后来发现是代理跨域问题,所以又简单理解了一下跨域. 出现的问题是我在axios拦截器上设置了请求头token,但是在发送请求时并未携带token, 经过原因排查, 发现我在请求路径时直接设置为服务器环境域名,改为localhost,并通过proxy代理后成功设置了请求头token. 首先,了解什么是跨域? 当一个请求url的协议.域名.端口三者之间任意一个与当前页面url不同即为跨域. 我们常见的跨域场景: U