微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Ajax跨域问题三种解决方案

在这里插入图片描述

Ajax同源政策

Ajax请求限制

Ajax 只能向自己的服务器发送请求。比如现在有一个A网站、有一个B网站,A网站中的 HTML 文件只能向A网站服务器中发送 Ajax 请求,B网站中的 HTML 文件只能向 B 网站中发送 Ajax 请求,但是 A 网站是不能向 B 网站发送 Ajax请求的,同理,B 网站也不能向 A 网站发送 Ajax请求。

什么是同源

如果两个页面拥有相同的协议、域名和端口,那么这两个页面就属于同一个源,其中只要有一个不相同,就是不同源。
http://www.example.com/dir/page.html

http://www.example.com/dir2/other.html:同源
http://example.com/dir/other.html:不同源(域名不同)
http://v2.www.example.com/dir/other.html:不同源(域名不同)
http://www.example.com:81/dir/other.html:不同源(端口不同)
https://www.example.com/dir/page.html:不同源(协议不同)

同源政策的目的

同源政策是为了保证用户信息的安全,防止恶意的网站窃取数据。最初的同源政策是指 A 网站在客户端设置的 Cookie,B网站是不能访问的。
随着互联网的发展,同源政策也越来越严格,在不同源的情况下,其中有一项规定就是无法向非同源地址发送Ajax 请求,如果请求,浏览器就会报错。

方法一:使用 JSONP 解决同源限制问题

在这里插入图片描述

在这里插入图片描述

对jsonp进行封装

function jsonp (options) {
	// 创建script标签
	var script = document.createElement('script');
	// 生成随机函数名
	var fnName = 'jsonp' + Math.random().toString().replace('.', '') + new Date().getTime();
	// 为全局作用域下添加一个属性 属性的名字就是我们随机生成函数名
	// 让属性的值指向调用jsonp函数时传递的success
	window[fnName] = options.success;
	// 参数
	var params = '';
	// 循环用户传递的参数
	for (var attr in options.data) {
		params += '&' + attr + '=' + options.data[attr]
	}
	// 为script标签设置src属性
	script.src = options.url + '?callback=' + fnName + params;
	// 将html标签追加到页面中
	document.body.appendChild(script);
	// 当script标签加载完成之后
	script.onload = function () {
		// 将script标签页面删除
		document.body.removeChild(this);
	}
}

方法二:CORS 跨域资源共享

CORS:全称为 Cross-origin resource sharing,即跨域资源共享,它允许浏览器向跨域服务器发送 Ajax 请求,克服了 Ajax 只能同源使用的限制。

在这里插入图片描述

Node 服务器端设置响应头示例代码

//一般都写在所有路由之前
 app.use((req, res, next) => {
     res.header('Access-Control-Allow-Origin', '*');//* 代表所有客户端都可以访问我
     res.header('Access-Control-Allow-Methods', 'GET, POST');
     next();
 })

方法三:利用服务器端不受同源限制

在这里插入图片描述

withCredentials属性

在使用Ajax技术发送跨域请求时,认情况下不会在请求中携带cookie信息。
如果需要携带cookie,必须给客户端和服务端写入下面代码

//写在客户端
withCredentials:true; 指定在涉及到跨域请求时,是否携带cookie信息,认值为false
//写在服务端
Access-Control-Allow-Credentials:true; 允许客户端发送请求时携带cookie

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐