使用XHR2或Jsonp实现跨域以及实现原理

我们直接使用XMLHttpRequset请求外部接口 会发现

报这个错误

其实浏览器成功发送请求并拿回了数据  只是浏览器的同源策略 禁止了获取  在xhr2 服务器端支持跨域 需要在响应头增加

Access-Control-Allow-Origin: * //*代表任何域。也可以指定地址

Access-Control-Allow-Methods: POST,GET //支持的方法

同源策略

同源策略主要针对XMLHttpRequset   保证请求url 必须跟当前站点的协议 域名 端口 一致

XHR2 CORS(跨域资源共享)实现跨域请求

XHRWidtCredentils 跨域请求是否包含cookie  票据等凭证(不常使用见)

可以通过这个属性判断是否支持跨域:

if(new XHRHttpRequset().XHRWidtCredentils==undefied)return false;

服务器端响应接口需要加上这2个响应头头

Access-Control-Allow-Origin: * //*代表任何域。也可以指定地址

Access-Control-Allow-Methods: POST,GET //支持的方法

    window.onload = function () {
        var xhr = new XMLHttpRequest();
        if (xhr.withCredentials === undefined) return false;

        xhr.open("get", "http://www.baidu.com");
        xhr.onreadystatechange = function () {
            if (xhr.readyState !== 4) return;//忽略未完成的调用
            if (xhr.status === 200) {
                console.log(xhr.responseText);
            }
        }
        xhr.send(null);
    }

JsonP实现跨域请求

服务器端支持:返回数据格式必须是calback({json数据})  callback必须是请求客户端存在的回调函数

浏览器端:

通过创建script标签请求外部资源 没有同源策略限制

支持跨域请求的服务端  响应数据为callback({json数据})    当作为js解析 则正好调用了我们的回调函数

例子:

客户端

 

    function GetJsonp(url, callback) {

        var responseCallback = callback.name + GetJsonp.index++;//为每次调用生成一个唯一的回调名字
        var scriptDom = document.createElement("script");//创建一个script标签
        //生成一个随机的 服务器端回调函数
        GetJsonp[responseCallback] = function (data) {
            try {
                //最终回调我们自己的处理函数
                callback(data);
            } finally {
                //每次请求完成后函数
                document.removeChild(scriptDom);//删除标签
                delete GetJsonp[responseCallback];//删除生成的函数
            }
        }

        if (url.indexof("?") === -1) {
            //如果url没有包含参数 则添加服务器端生成回调的函数
            url += "?callback=" + "GetJsonp[" + responseCallback + "]";
        } else {
            //仅仅是追加参数
            url += "&callback=" + "GetJsonp[" + responseCallback + "]";
        }
        //设置script标签的请求地址
        scriptDom.src = url;
        //将他追加到文档
        document.appendChild(scriptDom);
    }

服务器端

根据学号查询学生信息的支持跨域接口 http://www.studentl.com/?studentid=""&callback=""

服务端最终 查询数据 响应客户端 这样的内容requset.queryString["callback"]+"({json数据})“

时间: 2024-08-06 09:59:56

使用XHR2或Jsonp实现跨域以及实现原理的相关文章

跨域解决方案二:使用JSONP实现跨域

跨域的实现方式有多种,除了 上篇文章 提到的CORS外,常见的还有JSONP.HTML5.Flash.iframe.xhr2等. 这篇文章对JSONP的跨域原理进行了探索,并将我的心得记录在这里和大家分享. JSONP跨域原理探秘 我们知道,使用 XMLHTTPRequest 对象发送HTTP请求时,会遇到 同源策略 问题,域不同请求会被浏览器拦截. 那么是否有方法能绕过 XMLHTTPRequest 对象进行HTTP跨域请求呢? 换句话说,不使用 XMLHTTPRequest 对象是否可以发送

Vue中使用jsonp进行跨域请求

Vue-resouse中可以通过this.$http.jsonp的方式直接使用jsonp进行跨域请求.官方在推荐使用axios之后,axios并没有集成jsonp.但在axios的github中(https://github.com/mzabriskie/axios/blob/master/COOKBOOK.md#jsonp),可以直接安装jsonp并使用他来坐跨域请求. <script> var jsonp = require('jsonp'); export default { data(

JSONP实现跨域

利用JSONP实现跨域请求 前言:有时候一忙起来就没了时间观念,原来我已经有十多天没写博客了.一直想做跨域方面的尝试,无奈最近准备校招没时间动动手.今天就先讲讲JSONP吧,昨晚还在研究QQ空间日志里面网络图片的问题呢,我发现日志还提供了HTML模式,我们可以利用img标签的src属性实现跨域请求,从自己的服务器里提取动态内容. JSONP 在讲实现之前,我们先来看看何为JSONP.以下是维基百科的解释: JSONP or "JSON with padding" is a commun

跨域 - 自定义 jsonp实现跨域

问题:在现代浏览器中默认是不允许跨域. 办法:通过jsonp实现跨域 在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的.但是,在页面上引入不同域上的js脚本文件却是可以的,jsonp正是利用这个特性来实现的. 有两个站点: 1.要获取数据的站点:http://localhost:1326/Default.aspx 1.1页获取页面的json数据 2.要显示获取结果的站点 数据源页面的源码 protectedvoid Page_Load(object sender,

PHP AJAX JSONP实现跨域请求使用实例

在之前我写过“php返回json数据简单实例”,“php返回json数据中文显示的问题”和“在PHP语言中使用JSON和将json还原成数组”.有兴趣的童鞋可以看看 今天我写的是PHP AJAX JSONP使用的实例.不清楚jsonp是什么的请自己搜索 实例1 test.html <!doctype html> <html> <head> <meta charset="utf-8"> <title>test</title

jsonp实现跨域访问

要实现JSONP跨域访问,首先就要了解什么是跨域?然后JSONP与JSON的关系? 1.什么是跨域? 跨域简单的说就是一个域名下的程序和另一个域名下的程序做数据交互.比如说:现有一个http://www.zq.com和http://www.qt.com两个独立的网站,要实现从后一个网站向前一个网站中取数据.把做为数据来源的当作服务端,把去获取数据的当作客户端,实现面向服务的编程. 在动态网页当中,最重要的一项就是取数据.如果是在同一个项目中,将网站挂在同一个域名下,这种情况下无论是前台Ajax还

使用 JSONP 实现跨域通信

简介 Asynchronous JavaScript and XML (Ajax) 是驱动新一代 Web 站点(流行术语为 Web 2.0 站点)的关键技术.Ajax 允许在不干扰 Web 应用程序的显示和行为的情况下在后台进行数据检索.使用 XMLHttpRequest 函数获取数据,它是一种 API,允许客户端 JavaScript 通过 HTTP 连接到远程服务器.Ajax 也是许多 mashup 的驱动力,它可将来自多个地方的内容集成为单一 Web 应用程序. 不过,由于受到浏览器的限制

使用jsonp进行跨域访问

一.使用场景 当我们请求非本服务器的资源的时候,浏览器会禁止访问,并提示不允许跨域访问.此时我们可以使用jsonp这种请求方式,从其他服务器获取资源.在客户端调用提供jsonp支持的接口,获取jsonp格式的数据. 二.客户端的实现 客户端使用jsp,用js发送ajax请求,代码如下: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%

JS跨域:jsonp、跨域资源共享、iframe+window.name

JS跨域:jsonp.跨域资源共享.iframe+window.name :https://www.cnblogs.com/doudoublog/p/8652213.html JS中的跨域 请求跨域有好多种, 一.跨域资源共享: 也就是设置服务端的header,可以指定哪些域名可以请求,也是最简单的跨域方式(自我感觉),并且可以支持post等等. //指定允许其他域名访问 'Access-Control-Allow-Origin:*'//或指定域 //响应类型 'Access-Control-A