XMLHttpRequest.withCredentials 属性全面解析
词源分解与功能定位
withCredentials 由两部分构成:
with(携带):表示伴随或包含
Credentials(凭证):指认证信息如cookies、HTTP认证等
该属性控制跨域请求时是否携带用户凭证信息,解决跨域请求的安全性问题
语法结构
基础设置方式:
xhr.withCredentials = true; // 允许携带凭证 const creds = xhr.withCredentials; // 获取当前设置
属性特征:
布尔类型,默认为false
必须在
open()之后、send()之前设置同步请求设置会抛出InvalidStateError异常
参数值与功能说明
1. 参数值类型
属性示例与输出
基础跨域请求示例
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data', true);
xhr.withCredentials = true; // 关键设置
xhr.onload = function() {
console.log('响应数据:', xhr.response);
};
xhr.send();
// 成功输出示例:
// {user: "admin", token: "xyz123"}凭证验证失败案例
xhr.withCredentials = true;
xhr.open('GET', 'https://api.other.com/auth', true);
xhr.onerror = function() {
console.error('请求失败:', xhr.status);
};
xhr.send();
// 可能输出(服务器未配置CORS):
// 请求失败: 0应用场景分析
1. 跨域单点登录(SSO)
// 主站向认证服务发起请求
xhr.withCredentials = true;
xhr.open('GET', 'https://auth.service.com/session', true);
xhr.onload = updateUserStatus;2. 第三方API授权
// 携带OAuth令牌访问API
xhr.withCredentials = true;
xhr.setRequestHeader('Authorization', 'Bearer token123');
xhr.open('POST', 'https://api.provider.com/data', true);3. 跨域文件上传
// 上传到不同域的文件存储服务
const formData = new FormData();
formData.append('file', fileInput.files[0]);
xhr.withCredentials = true;
xhr.open('POST', 'https://storage.example.com/upload', true);注意事项
服务器配置要求:
必须返回
Access-Control-Allow-Credentials: trueAccess-Control-Allow-Origin不能为通配符*需明确指定允许的源(如
https://yourdomain.com)安全限制:
第三方cookie仍受同源策略保护
无法通过JavaScript读取跨域cookie
浏览器兼容性:
IE10+完全支持
移动端浏览器可能有特殊限制
预检请求影响:
复杂请求会先发送OPTIONS预检
服务器需正确处理OPTIONS请求
综合比较表
最佳实践建议
动态源配置:
// 根据当前域自动设置 xhr.withCredentials = !isSameOrigin(requestUrl);
错误恢复机制:
xhr.onerror = function() {
if(xhr.status === 0) {
fallbackToJSONP(); // CORS失败备选方案
}
};安全检测:
if(needCredentials && !('withCredentials' in xhr)) {
alert('浏览器不支持安全凭证传输');
}通过合理使用withCredentials属性,可以实现安全的跨域认证交互,但必须严格遵循CORS规范并做好兼容性处理