博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript实现jsonp&&CORS
阅读量:6901 次
发布时间:2019-06-27

本文共 2807 字,大约阅读时间需要 9 分钟。

(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

你可能感兴趣的文章
我的友情链接
查看>>
java单例模式之线程安全问题
查看>>
Notes打不开的故障总结
查看>>
WEB打印控件Lodop(V6.x)
查看>>
我的友情链接
查看>>
UI集成测试运行说明
查看>>
ES与Javscript,JScript,ActionScript等脚本
查看>>
断点的技巧
查看>>
mariadb配置安装
查看>>
自己做网站怎么计算带宽需求
查看>>
流镜像,端口镜像
查看>>
3月23日作业
查看>>
C语言之枚举
查看>>
我的友情链接
查看>>
程序员学习能力提升三要素
查看>>
Mysqli的批量CRUD数据
查看>>
oracle 10g升级流程
查看>>
linux下DNS服务器的实现1
查看>>
BGinfo设置记录文档
查看>>
爆款打造之中小卖家如何做到零成本选/测款?(一)
查看>>