原生JS实现Ajax的跨域请求
原生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的跨域请求的更多相关文章
- 原生JS实现Ajax及Ajax的跨域请求
		
前 言 如今,从事前端方面的程序猿们,如果,不懂一些前后台的数据交互方面的知识的话,估计都不太好意思说自己是程序猿.当然,如今有着许多的框架,都有相对应的前后台数据交互的方法. ...
 - Ajax之跨域请求
		
一.引子 我现在开启了两个django项目,分别叫Demo1和Demo2,Demo1中有一个路径‘http://127.0.0.1:8000/index/’,对应的视图是index视图返回一个inde ...
 - 利用Nginx轻松实现Ajax的跨域请求(前后端分离开发调试必备神技)
		
利用Nginx轻松实现浏览器中Ajax的跨域请求(前后端分离开发调试必备神技) 前言 为什么会出现跨域? 造成跨域问题的原因是因为浏览器受到同源策略的限制,也就是说js只能访问和操作自己域下的资源,不 ...
 - 原生JavaScript封装的jsonp跨域请求
		
原生JavaScript封装的jsonp跨域请求 <!DOCTYPE html> <html lang="en"> <head> <met ...
 - 原生JS封装Ajax插件(同域&&jsonp跨域)
		
抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...
 - 【笔记】Asp.Net WebApi对js POST带参数跨域请求的支持方案
		
先说下需求:在原来的WebApi项目中增加对js跨域的请求支持,请求方式:以POST为主,webapi路由规则根据原项目需求修改如下: public static void Register(Http ...
 - jQuery的Ajax的跨域请求
		
今天碰到一个Ajax跨域请求的问题,我把源码down下来,然后在服务器端写了一个http请求的代理(因为服务器端是不存在跨域问题的),说白了就是用BufferedReader写了个IO流,然后读取到目 ...
 - jQuery的ajax jsonp跨域请求
		
了解:ajax.json.jsonp.“跨域”的关系 要弄清楚以上ajax.json.jsonp概念的关系,我觉得弄清楚ajax是“干什么的”,“怎么实现的”,“有什么问题”,“如果解决存在的问题”等 ...
 - ajax的跨域请求
		
同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上的 ...
 
随机推荐
- C++ 函数模板/类模板
			
#include <iostream> #include <vector> using namespace std; template < class T > // ...
 - 【Weiss】【第03章】练习3.22、3.23、3.24:无代码题,栈的思考题
			
[练习3.22] a.提出支持栈的Push和Pop操作以及第三种操作FindMin的数据结构,其中FindMin 返回该数据结构的最小元素,所有操作在最坏情况下的运行时间都是O(1). b.证明,如果 ...
 - java-打印流(新手)
			
实例:1.直接输出到文件里面. import java.io.*; //打印流->保持数据原样性并且打印.(各种数据类型.) public class Dyl { public static v ...
 - File类的构造方法:三种重载形式(新手)
			
//导入的包.import java.io.File;//File类的构造方法 三种重载形式//创建的一个类.public class zylx1 { //公共静态的主方法. public stati ...
 - Kafka的面试题
			
1.Kafka的设计是什么样的呢?Kafka将消息以topic为单位进行归纳将向Kafka topic发布消息的程序成为producers.将预订topics并消费消息的程序成为consumer.Ka ...
 - div或者p标签单行和多行超出显示省略号
			
单行文本溢出显示省略号 overflow: hidden;text-overflow:ellipsis;white-space: nowrap;多行文本显示省略号 display: -webkit-b ...
 - 信息收集工具-dimtry
			
GitHub地址: kali下也是自带的: -s以及-e 参数需要用到Google搜索 1.获取whois主机ip信息 2.扫描端口,根据banner信息判断服务
 - django-jwt token校验源码简析
			
一. jwt token校验源码简析 1.1 前言 之前使用jwt签发了token,里面的头部包含了加密的方式.是否有签名等,而载荷中包含用户名.用户主键.过期时间等信息,最后的签名还使用了摘要算法进 ...
 - Ansible权威指南-读书笔记
			
2 Ansible基础元素介绍 2.1 ansible 目录结构介绍 2.2 ansible 配置文件解析 配置文件解析顺序:当前命令执行目录-->用户家目录下的.ansible.cfg--&g ...
 - Idea无法调出搜狗等中文输入法
			
在用户目录下的文件.xprofile 中添加一下内容 export GTK_IM_MODULE=fcitx export QT_IM_MODULE=fcitx export XMODIFIERS=“@ ...