使用XMLHttpRequest发送请求无法携带Cookie

本文探讨了使用XMLHttpRequest发送请求时无法携带Cookie的问题,并提供了解决方案,包括使用img标签和设置withCredentials参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用XMLHttpRequest发送请求无法携带Cookie

最近在项目里设计了一段JS,需要客户网站嵌入这段JS,然后使用XMLHTTPRequest发送请求,但是发现请求中无法携带Cookie。

经过研究发现XMLHTTPRequest发送请求是无法携带Cookie的,即使使用了setRequestHeader方法是设置请求头里的cookie,也无法携带cookie。

var xhr = new XMLHttpRequest();
xhr.setRequestHeader('Cookie', 'mycookie=cookie');

原因如下:https://stackoverflow.com/questions/15198231/why-cookies-and-set-cookie-headers-cant-be-set-while-making-xmlhttprequest-usin

所以就想到可以在JS里面动态插入一个Pixel(一个长宽为1的img标签,src属性为请求的URL)来发送请求,能成功携带cookie,示例代码如下:

var imgTag = document.createElement('img');
var bodyTag = document.getElementsByTagName('body')[0];
imgTag.height = 1;
imgTag.width = 1;
imgTag.style = 'border-style: none; display: none';
imgTag.alt = '';
imgTag.src = tbUrl;    //你要发请求的url

bodyTag.insertBefore(imgTag, bodyTag.childNodes[0]);

另外 还可以在请求头里面加入withCredentials: true来实现:

function postJson(url, data, isWithCredentials) {
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.onreadystatechange = function () {
        if (xmlHttp.readyState === 4 && xmlHttp.status === 200)
            console.log(xmlHttp.responseText);
    };
    xmlHttp.open("POST", url, true); // true for asynchronous
    if (isWithCredentials === true) {
        xmlHttp.withCredentials = true;
    }
    xmlHttp.send(JSON.stringify(data));
}
### 如何在前端HTTP请求头中正确设置和发送Cookie 为了确保前端发出的AJAX请求能够携带Cookie信息,在发起请求时需设置`withCredentials: true`选项[^1]。此操作使得浏览器允许XMLHttpRequest或Fetch API在跨域请求发送凭证(如Cookies)。然而,这仅是实现过程的一部分。 当涉及到带有Secure属性标记的Cookie时,只有HTTPS协议下的请求才会附带这些Cookie数据传输给服务器[^2]。这意味着如果目标资源通过HTTP访问而尝试获取设置了Secure标志位的Cookie,则该Cookie不会随同请求一起提交至服务端。 另外值得注意的是,除了客户端配置外,还需要确认服务器端已适当处理CORS(Cross-Origin Resource Sharing),即跨源资源共享策略。具体来说就是响应头部应包含如下字段: - `Access-Control-Allow-Credentials`: 设置为`true`表示可以接受来自其他域名的信任连接并返回用户认证信息; - `Access-Control-Allow-Origin`: 明确指定哪些来源是可以信任并与之交互的网站地址; 下面是一个使用JavaScript Fetch API来构建一个支持携带Cookie的GET请求的例子: ```javascript fetch('https://example.com/api/data', { method: 'GET', credentials: 'include' // 等价于 withCredentials: true 对于 XMLHttpRequest }) .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('Error:', error)); ``` 对于那些遇到即使遵循上述指导仍然无法正常工作的情况,可能是因为存在某些特定环境因素影响着整个流程的有效执行。例如,防火墙规则、代理服务器行为或是浏览器的安全特性都可能导致实际效果偏离预期。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值