跨域请求

Posted xiaolanschool

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跨域请求相关的知识,希望对你有一定的参考价值。

跨域:当协议、子域名、主域名、端口号中任意一各不相同时,都算不同的“域”。不同的域之间相互请求资源,就叫“跨域”。浏览器的安全策略是需要同源,目的是保护用户的安全信息。如cookie、localStorage和IndexDB无法读取,无法操作跨域的iframe里的dom元素,ajax请求不能发送。

一、浏览器允许所有的请求

 只需要在服务器端头部加上:header( "Access-Control-Allow-Origin: *" ); 一般为了安全起见,前端需设置token返回给后端,此方式在项目中并不适用

二、利用jsonp跨域

jsonp方式只适用GET请求,jsonp利用<script src=“”>标签跨域的特性,允许用户传递一个callback 或者开始就定义一个回调方法,参数给服务端,然后服务端返回数据时会将这个callback 参数作为函数名来包裹住json数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。

 //回调函数
function handleCallback (result) {
    var data = JSON.stringify(result); //json对象转成字符串
     $("#val").val(data);
}
 
//向头部输入一个脚本,该脚本发起一个跨域请求
$("head").append("<script src=‘http://localhost:8000/index?callback=handleCallback‘></script>");

三、利用cors实现跨域(Cross-Origin Resource Sharing---跨域资源共享)

CORS支持所有类型的HTTP请求,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制,整个CORS通信过程,都是浏览器自动完成,自动添加头部信息,不需要用户参与。

1、简单的请求: head,get,post请求和Content-Type为application/x-www-form-urlencodedmultipart/form-datatext/plain

2、非简单的请求:put,delete和content-type为application/json

非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。

浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。

3、cors方法也可以适用jsonp

function handleCallback(data) {
    $("#val").val(data);
}
$.ajax({
    url: "http://localhost:8000/index",
    type: "GET",
    dataType: "jsonp", //指定服务器返回的数据类型
    //jsonp: "theFunction", //指定参数名称
    jsonpCallback: "handleCallback", //指定回调函数名称
    success: function (data) {
         alert(‘success‘);
    }
});
    

 

以上是关于跨域请求的主要内容,如果未能解决你的问题,请参考以下文章

Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段

如何发送跨域ajax请求[重复]

跨域请求如何携带cookie?不小心都拿了Offer

vue工程本地代码请求http发生跨域提示错误解决方法

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装