原生JS如何实现Ajax的跨域请求?

在解决这个问题之前,我们务必先清楚为什么我们要跨域请求,以及在什么情况下会跨域请求。

了解一下:“同源策略”,你就知道了;

  同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的关键的安全机制。

  它的定义是:

    一段脚本向后台请求数据,只能读取属于同一协议名、同一主机名、同一端口号下的数据;

    所以,请求不同协议名、不同端口号、不同主机名下面的文件时,

  将会违背同源策略,无法请求成功,需要进行跨越处理!!

解决跨域请求的方法:

方法一:

  通过后台的PHP进行设置

  前台无需任何设置,在后台被请求的PHP文件中,写入一条header。

    header("Access-Control-Allow-Origin:*");    --- 表示允许哪些域名请求这个PHP文件,*表示所有域名都允许

JS代码:  

$.post("http://127.0.0.1/json.php",function(data){
console.log(data);
});

注释:

  其中,url为PHP文件的路径;

PHP代码:

<?php
header("Content-Tyepe:text/html;charset=utf-8");
header("Access-Control-Allow-Origin:*");
$str = <<<str
[
{
"name": "影子",
"age": 17,
"hobby": [
"吃",
"喝",
"玩",
"乐"
],
"score":{
"math":78,
"chinese":89
}
},
]
str;
echo $str;

结果:

  

方法二:

  实现步骤: 

    1、原有src属性的标签子带跨域功能;所以可以使用script标签的src属性请求后台数据

       <script src="http://127.0.0.1/json.php">< /script>

    2、用于src在加载数据成功后,会直接将加载的内容放到script标签中;

         所以,后台直接返回JSON字符串将不能在script标签中解析。

       因此,后台应该返回给前台一个回调函数名,并将JSON字符串作为参数传入。

        后台PHP文件中返回: echo "callback({$json})";

     3、前台接收到返回的回调函数,将直接在script标签中调用。因此,需要声明这样一个回调函数,作为请求成功的回调

function callback(data){

    alert("请求成功!!");

    console.log(data);

}

JS代码:

<script type="text/javascript">
function callback(data){
console.log(data);
}
</script>
<script src="http://127.0.0.1/json.php"></script>

PHP文件:

<?php
header("Content-Tyepe:text/html;charset=utf-8");
$str = <<<str
[
{
"name":"yingzi",
"age":17,
"hobby":[
"吃",
"喝",
"玩",
"乐"
],
}
]
str;
echo "callback({$str})";

结果:

方法三:

   1、在ajax请求时,设置dataType为"jsonp";

2、后台返回时,依然需要返回回调函数名,但是,ajax在发送请求时,会默认使用get请求将回调函数名发给后台,

     后台$_GET['callback'] 取出函数名:

      ---   echo "{$_GET['callback']}({$str})";

3、后台返回以后,前台就可以使用ajax的success函数作为成功的回调

        ---    success : function(data){}

JS代码:

<script type="text/javascript">
$.ajax({
type:"post",
url:"http://127.0.0.1/json.php",
dataType:"jsonp",
success:function(data){
console.log(data);
}
});
</script>

PHP文件:

<?php
header("Content-Tyepe:text/html;charset=utf-8");
$str = <<<str
[
{
"name":"yingzi",
"age":17,
"hobby":[
"吃",
"喝",
"玩",
"乐"
],
}
]
str;
echo "{$_GET['callback']}({$str})";

结果:

当然,后台也可以随便返回一个函数名,前台只要请求成功,就会自动调用这个函数。类似第二条的②、③步,而不需要本方法的第③步

PHP返回: echo "callback({$str})";

JS代码:  function callback(data){

        console.log(data);

      }

JS代码:

<script type="text/javascript">
$.ajax({
type:"post",
url:"http://127.0.0.1/json.php",
dataType:"jsonp",
});
function(data){
console.log(data);
}
</script>

PHP文件:

<?php
header("Content-Tyepe:text/html;charset=utf-8");
$str = <<<str
[
{
"name":"yingzi",
"age":17,
"hobby":[
"吃",
"喝",
"玩",
"乐"
],
}
]
str;
echo "callback({$str})";

结果:

Web前端工程师,关于数据交互这一块,会用到的地方很多;这是大神“影子”的文章,我是无耻的搬运过来的,如有侵权,请联系本人删除;下面附上“影子”的博客原文链接:https://www.cnblogs.com/2502778498spw/p/7784390.html

原生JS实现Ajax的跨域请求的更多相关文章

  1. 原生JS实现Ajax及Ajax的跨域请求

      前  言          如今,从事前端方面的程序猿们,如果,不懂一些前后台的数据交互方面的知识的话,估计都不太好意思说自己是程序猿.当然,如今有着许多的框架,都有相对应的前后台数据交互的方法. ...

  2. Ajax之跨域请求

    一.引子 我现在开启了两个django项目,分别叫Demo1和Demo2,Demo1中有一个路径‘http://127.0.0.1:8000/index/’,对应的视图是index视图返回一个inde ...

  3. 利用Nginx轻松实现Ajax的跨域请求(前后端分离开发调试必备神技)

    利用Nginx轻松实现浏览器中Ajax的跨域请求(前后端分离开发调试必备神技) 前言 为什么会出现跨域? 造成跨域问题的原因是因为浏览器受到同源策略的限制,也就是说js只能访问和操作自己域下的资源,不 ...

  4. 原生JavaScript封装的jsonp跨域请求

    原生JavaScript封装的jsonp跨域请求 <!DOCTYPE html> <html lang="en"> <head> <met ...

  5. 原生JS封装Ajax插件(同域&&jsonp跨域)

    抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...

  6. 【笔记】Asp.Net WebApi对js POST带参数跨域请求的支持方案

    先说下需求:在原来的WebApi项目中增加对js跨域的请求支持,请求方式:以POST为主,webapi路由规则根据原项目需求修改如下: public static void Register(Http ...

  7. jQuery的Ajax的跨域请求

    今天碰到一个Ajax跨域请求的问题,我把源码down下来,然后在服务器端写了一个http请求的代理(因为服务器端是不存在跨域问题的),说白了就是用BufferedReader写了个IO流,然后读取到目 ...

  8. jQuery的ajax jsonp跨域请求

    了解:ajax.json.jsonp.“跨域”的关系 要弄清楚以上ajax.json.jsonp概念的关系,我觉得弄清楚ajax是“干什么的”,“怎么实现的”,“有什么问题”,“如果解决存在的问题”等 ...

  9. ajax的跨域请求

    同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上的 ...

随机推荐

  1. 大龄IT人的新的一年

    一转眼,工作十几年了,之前由于有时要出差,孩子偶尔放回老家,有时到处找人看孩子,虽然不出差时都是有我来带,孩子还是和我很亲,但是一直没时间关注她的学习,只是睡前读读绘本,报了个英语培训班,偶尔玩玩识字 ...

  2. 一个和与后台数据连接的模板get post put 以及延伸的query

    /* example: require.config({ paths: { "httpClient": "../../core/http-client" } } ...

  3. 把 GitHub 放入口袋,“开箱”官方客户端

    GitHub 2019 开发者大会说要出的客户端,今天(2020.3.18)终于放出了下载.之前如果登记过的小伙伴应该也和我一样收到了下面样子的邮件: 好了,那么接下来我们就来"开箱&quo ...

  4. 网页外链用了 target="_blank",结果悲剧了

    今天给大家分享一个 Web 知识点.如果你有过一段时间的 Web 开发经验,可能已经知道了.不过对于刚接触的新手来说,还是有必要了解一下的. 我们知道,网页里的a标签默认在当前窗口跳转链接地址,如果需 ...

  5. AndroidStudio提高编译速度的几种方法

    第一种: 减少依赖库的使用,让代码更加精简.对于一些必须依赖的库要尽量使用jar包或者依赖库,这样他每次就会在本地直接加载,而不是每次翻墙检查更新 第二种: 打开Android Studio,选择菜单 ...

  6. BJDCTF

    python3的模板注入 非常简单...就是直接执行命令就行..虽然过滤了flag,但是拼接下就好了.... payload: http://fd5883ee-b8e2-4bf1-88af-33936 ...

  7. JavaScript隐式类型转换(详解 +,-,*,/,==)

    JavaScript 在 运算 或 比较 之前, 会自动进行隐式类型转换. 下面我们来仔细讲一讲 + - * / == 运算符经历了哪些过程. 类型转换 ECMAScript 运行时系统会在需要时从事 ...

  8. Linux学习第六天

    学习Linux环境下的挂载命令. 什么是挂载命令? 1.Windows下,mount挂载,就是给磁盘分区提供一个盘符(C,D,E,...).比如插入U盘后系统自动分配给了它I:盘符其实就是挂载,退优盘 ...

  9. 读书笔记——莫提默·J.艾德勒&查尔斯·范多伦(美)《如何阅读一本书》

    第一篇 阅读的层次 第一章 阅读的活力与艺术 阅读的目标:娱乐.获得资讯.增进理解力这本书是为那些想把读书的主要目的当作是增进理解能力的人而写.何谓阅读艺术?这是一个凭借着头脑运作,除了玩味读物中的一 ...

  10. SpringMVC框架——自定义数据类型转换器

    Spring MVC 框架的 Converter<S,T> 是一个可以将一种数据类型转换成另一种数据类型的接口,这里 S 表示源类型,T 表示目标类型. 开发中如果需要自定义数据类型转换时 ...