跨域(Cross-Origin)是指浏览器出于安全考虑,限制网页从一个源(协议+域名+端口)向另一个源发起请求。jQuery AJAX默认遵循同源策略(Same-Origin Policy),即只能向同源的服务器发起请求。
原理:利用<script>
标签不受同源策略限制的特性
jQuery实现:
$.ajax({
url: 'http://example.com/api',
dataType: 'jsonp',
jsonp: 'callback',
success: function(response) {
console.log(response);
}
});
限制:
服务器端设置:
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type
jQuery AJAX请求:
$.ajax({
url: 'http://example.com/api',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({key: 'value'}),
success: function(response) {
console.log(response);
},
error: function(xhr, status, error) {
console.error(error);
}
});
实现方式:
示例:
// 前端请求
$.ajax({
url: '/proxy?url=http://example.com/api',
type: 'GET',
success: function(response) {
console.log(response);
}
});
原因:服务器未正确设置CORS头部
解决方案:
Access-Control-Allow-Origin
头部withCredentials: true
并确保服务器允许原因:服务器未正确处理OPTIONS请求
解决方案:
Access-Control-Allow-Methods
和Access-Control-Allow-Headers
原因:
解决方案:
callbackFunctionName({...})
jsonp
和jsonpCallback
参数设置Access-Control-Allow-Origin
为特定域名而非*
Access-Control-Allow-Origin: *
,可能带来安全风险withCredentials
和服务器端CORS配置