JavaScript实现jsonp&&CORS

(function (global) {
    var id = 0, container = document.head || document.getElementsByTagName(‘head‘)[0];

    function jsonp(options) {
        if (!options || !options.url) return;
        var scriptNode = document.createElement("script"),
            url = options.url,
            data = options.data || {},
            callback = options.callback,
            fnName = ‘jsonp‘ + id++;
        //添加回调函数
        data["callback"] = fnName;
        //拼接Url
        var params = [];
        for (var key in data) {
            params.push(encodeURIComponent(key) + ‘=‘ + encodeURIComponent(data[key]));
        }

        url = url.indexOf("?") > 0 ? (url + "&") : (url + "?");
        url += params.join("&");
        scriptNode.src = url;

        //传递的是一个匿名的回调函数,需要执行,暴露为一个全局方法
        global[fnName] = function (ret) {
            callback && callback(ret);
            // container.removeChild(scriptNode);
            delete global[fnName];
        };

        //出错处理
        scriptNode.onerror = function (ev) {
            callback && callback({error: "error"});
            container.removeChild(scriptNode);
            global[fnName] && delete global[fnName]
        };
        scriptNode.type = "text/javascript";
        container.appendChild(scriptNode)
    }

    global.jsonp = jsonp;

})(this);
//1.直接添加以下两行header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept")

//2.来自于stackoverflow的cors方法
function cors() {
    // Allow from any origin
    if (isset($_SERVER[‘HTTP_ORIGIN‘])) {
        // Decide if the origin in $_SERVER[‘HTTP_ORIGIN‘] is one
        // you want to allow, and if so:
        header("Access-Control-Allow-Origin: {$_SERVER[‘HTTP_ORIGIN‘]}");
        header(‘Access-Control-Allow-Credentials: true‘);
        header(‘Access-Control-Max-Age: 86400‘);    // cache for 1 day
    }
    // Access-Control headers are received during OPTIONS requests
    if ($_SERVER[‘REQUEST_METHOD‘] == ‘OPTIONS‘) {
        if (isset($_SERVER[‘HTTP_ACCESS_CONTROL_REQUEST_METHOD‘]))
            header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
        if (isset($_SERVER[‘HTTP_ACCESS_CONTROL_REQUEST_HEADERS‘]))
            header("Access-Control-Allow-Headers: {$_SERVER[‘HTTP_ACCESS_CONTROL_REQUEST_HEADERS‘]}");
    }
}

  JSONP,利用了src引用静态资源时不受跨域限制的机制,在客户端定义一个回掉函数做数据接收处理,把回掉函数名告知服务器,服务端需要按照JavaScript的语法把数据放到约定好的回调函数之中。

  CORS,依附于Ajax,通过添加HTTP Header部分字段请求与获取有权限访问的资源。CORS对开发者透明,浏览器会自动根据请求的情况(简单和复杂)做出不同的处理。CORS需要服务器支持。

优缺点:

  1. JSONP的主要优势是浏览器支持较好,IE10以下不支持CORS

  2. JSONP只能用于获取资源(GET),CORS支持所有类型的HTTP请求。

  3. JSONP错误处理机制并不完善,无法进行错误处理,CORS可以通过监听onerror监听错误,浏览器控制台会看到报错信息。

  4. JSONP只会发一次请求;对于复杂请求,CORS会发两次请求。

  5. JSONP存在callback参数注入和资源访问授权设置。

CORS参考:http://www.ruanyifeng.com/blog/2016/04/cors.html

原文地址:https://www.cnblogs.com/web-Kongdp/p/8523698.html

时间: 2024-08-09 03:49:57

JavaScript实现jsonp&&CORS的相关文章

JSONP && CORS

前天面试被问到了跨域的问题,自我感觉回答的并不理想,下面我就分享一下整理后的总结分享给大家 一.为什么要跨域 安全限制 JavaScript或Cookie只能访问同域下的内容--同源策略 同源策略 下表相对于: http://h5.jd.com/dir/ajax.js 注意 协议和端口造成的跨域问题,非前端解决范畴 所谓域,是通过"url首部"来识别,而非判断域与ip的对应关系 ("URL的首部"指window.location.protocol +window.l

javascript笔记——jsonp

上篇博客介绍了同源策略和跨域访问概念,其中提到跨域常用的基本方式:JSONP和CORS. 那这篇博客就介绍JSONP方式.  JSONP原理 在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的,但img.iframe.script等标签是个例外,这些标签可以通过src属性请求到其他服务器上的数据. 而JSONP就是通过script节点src调用跨域的请求. 当我们通过JSONP模式请求跨域资源时,服务器返回给客户端一段javascript代码,这段javascript代码自动调用

跨域(jsonp cors)

同源策略它是由NetScape提出的一个著名的安全策略. 浏览器执行js,会检查它属于哪个页面,如果不是同源页面,不会被执行. 由于浏览器的同源策略,只要发送请求url与页面地址有不同的即为跨域.只要协议.域名.端口任何一个不同,就是不同的域. 常见的解决方案有: jsonp 跨域资源共享(CORS) 使用html5的window.postMessage 通过修改document.domain 使用window.name 1.jsonp jsonp 全称是JSON with Padding,是为

跨域资源请求 JSONP CORS

1.什么是跨域资源请求? https://blog.csdn.net/u014607184/article/details/52027879 1.1 同源策略 跨域的安全限制都是对浏览器端来说的,服务器端是不存在跨域安全限制. XMLHttpRequest 受同源策略限制 2.如何解决 跨域资源请求 限制 JSONP   https://blog.csdn.net/DFF1993/article/details/79925874 CORS http://www.ruanyifeng.com/bl

原生javascript实现jsonp的封装

JSONP即JSON with Padding.由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名.协议.端口)的资源.如果要进行跨域请求, 我们可以通过使用html的script标记来进行跨域请求,并在响应中返回要执行的script代码,其中可以直接使用JSON传递javascript对象. 这种跨域的通讯方式称为JSONP. 我们可以动态的去创建一个script标签,利用他的src属性没有跨域的限制来实现的,相当于我们引入一个js文件 附上源码: jsonp: funct

跨域访问JSONP CORS

一.JSONP 常用的Jquery框架支持jsonp方式请求,该方式只支持GET方法,传参大小有限,而且需要后台根据jsonp的请求方式进行封装结果返回. 其中参数jsonp默认为callback,jsonpCallback为随机生成的回调函数名,若指定handleRequest,则后台参数返回时为handleRequest("data"). 二.CORS 跨域资源共享CORS方式通过自定义HTTP头部来使浏览器和服务器互相了解对方. 服务器端对CORS的支持主要是设置相应的头部进行支

JavaScript的jsonp

目录索引: 一.AJAX的概念二.POST && GET三.原生实现AJAX简单示例 3.1 实现代码 3.2 重点说明四.框架隐藏域 4.1 基本概念 4.2 后台写入脚本 4.3 JS主动判断Iframe的改变 4.4 表单提交数据实战五.JQ 的 AJAX 5.1 load() 5.2 $.get() 5.3 $.post() 5.4 $.getScript() 5.5 $.getJson() 5.6 $.ajax() a. 常用的属性说明 b. 常用的事件说明 c. 全局事件说明

javascript 实现jsonp

jsonp原理其实也简单,虽然ajax不能跨域,但是通过src这个属性我们可以实现跨域,其实和我们引入第三方jquery调用它的方法一样的. html: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> &l

原生javascript里jsonp的实现原理

ajax不能跨域,jsonp可以跨域 跨域的核心思想: 调用(拿到的接口),定义(jsonp核心处理器)分别是不同的script标签里面进行跨script取数据(只有get方式进行取数据 ) jsonp传进来的数据是{url:'',data:{ cbName='cb',(根据接口制定的命名规范,有些事叫callback) wd='aaa', ......(之后的数据都要进行字符串拼接) },success:function(result){}} 一:设置默认状态(容错处理) json=json|