跨域与跨域访问_如何实现跨域访问

跨域与跨域访问_如何实现跨域访问什么是跨域跨域是指从一个域名的网页去请求另一个域名的资源。比如从www.baidu.com页面去请求www.google.com的资源。跨域的严格一点的定义是:只要协议,域名,端口有任何一个的不同,就被当作是跨域为什么浏览器要限制跨域访问呢?原因就是安全问题:如果一个网页可以随意地访问另外一个网站的资源,那么就有可能在客户完全不知情的情况下出现安全问题。比如下面的操作就有安全问题

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

什么是跨域

跨域是指从一个域名的网页去请求另一个域名的资源。比如从www.baidu.com 页面去请求 www.google.com 的资源。跨域的严格一点的定义是:只要 协议,域名,端口有任何一个的不同,就被当作是跨域

为什么浏览器要限制跨域访问呢?

原因就是安全问题:如果一个网页可以随意地访问另外一个网站的资源,那么就有可能在客户完全不知情的情况下出现安全问题。比如下面的操作就有安全问题:

  1. 用户访问www.mybank.com ,登陆并进行网银操作,这时cookie啥的都生成并存放在浏览器
  2. 用户突然想起件事,并迷迷糊糊地访问了一个邪恶的网站 www.xiee.com
  3. 这时该网站就可以在它的页面中,拿到银行的cookie,比如用户名,登陆token等,然后发起对www.mybank.com 的操作。
  4. 如果这时浏览器不予限制,并且银行也没有做响应的安全处理的话,那么用户的信息有可能就这么泄露了。

为什么要跨域

既然有安全问题,那为什么又要跨域呢? 有时公司内部有多个不同的子域,比如一个是location.company.com ,而应用是放在app.company.com , 这时想从 app.company.com去访问 location.company.com 的资源就属于跨域。

跨域访问需要的两件宝贝

由于浏览器一般不对script,img等进行跨域限制,所以我们有机会通过script的方式来实现跨域访问。

跨域访问需要用到两样东东,一个是JSON,一种基于文本的传输协议;一种是JSONP,一群码农想出来的跨域解决方案。关于JSON与JSONP的解释,可以参考 JSON & JSONP

实现跨域访问 服务端需要做什么

服务端要检查访问的请求参数,如果没有callback,则可以按照之前的流程走;如果带着callback参数,则需要将返回的结果包装在callback里面。

比如请求的URL是: app.company.com/location?callback=myCallback , 那么服务端则需要把结果封装进myCallback 函数里面, 如下

if (params.query && params.query.callback) {
    //console.log(params.query.callback);
    var str =  params.query.callback + '(' + JSON.stringify(data) + ')';//jsonp
    res.end(str);
  } else {
    res.end(JSON.stringify(data));//普通的json
  }     

实现跨域访问 客户端需要做什么

客户端有多种方式可以实现JSONP的调用:

  • jQuery
    jQuery可以在Ajax里面设置datatype为jsonp,则可以进行跨域访问
    $scope.jqueryJsonpRequest = function(){ 
   
        jQuery.ajax({
            type: "get",
            async: false,
            url: "https://public-api.wordpress.com/rest/v1/sites/wtmpeachtest.wordpress.com/posts",
            dataType: "jsonp",
            jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
            jsonpCallback:"flightHandler",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据
            success: function(json){ 
   
                alert('success' + JSON.stringify(json));
            },
            error: function(){ 
   
                alert('fail');
            }
        });
    };
  • AngularJS
    AngularJS的$http 也提供了对jsonp的访问,直接调用jsonp进行跨域访问
$http.jsonp('https://public-api.wordpress.com/rest/v1/sites/wtmpeachtest.wordpress.com/posts?callback=JSON_CALLBACK')
            .success(function(data){ 
   
                alert('success:'+data);
            }).error(function(err){ 
   
                alert('error:'+err);
        });
  • 手动实现
    不管是jQuery也好,AngularJS也罢,底下都不是发起XHR (XML HTTP Request),而都是通过加载javascript的方式来做的,所以如果项目没有依赖jQuery或者AngularJS,则可以自己手动实现jsonp的调用。

    原理很简单,就是用javascript动态加载一个script文件,同时定义一个callback函数给script执行而已。

    //定义callback 函数
    var myCallbackFunction = function(data){ 
         
            // 对返回的数据做后续处理
            alert('uuu:'+JSON.stringify(data));
        }
    //把callback函数赋给window对象,供script回调 
    window.myCallbackFunction = myCallbackFunction;
    //创建并加载script
    var script = document.createElement('script');
    script.src = 'https://public-api.wordpress.com/rest/v1/sites/wtmpeachtest.wordpress.com/posts?callback=myCallbackFunction';
    document.body.appendChild(script);
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187048.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Blender权威指南「建议收藏」

    Blender权威指南「建议收藏」#Blender权威指南###第一部分基础篇####1Blender概述#####1.1开源简介######1.1.1Blender是什么######1.1.2Blender的发

    2022年7月2日
    60
  • PyCharm激活码永久有效PyCharm2019.1.1激活码教程-持续更新,一步到位[通俗易懂]

    PyCharm激活码永久有效PyCharm2019.1.1激活码教程-持续更新,一步到位[通俗易懂]PyCharm激活码永久有效2019.1.1激活码教程-Windows版永久激活-持续更新,Idea激活码2019.1.1成功激活

    2022年6月19日
    43
  • arcgis python 教程-ArcGIS Python 入门到精通,视频教程下载

    arcgis python 教程-ArcGIS Python 入门到精通,视频教程下载课程介绍:本课程15章42个视频,基于ArcGIS10.2版本,涵盖了如何使用Python开发ArcGIS自定义工具,具体包括:编辑器的使用安装;列表函数使用;汉字乱码处理;游标(cursor)查询、更新和插入;几何图形生成和坐标导出;属性查询和空间查询;字段映射(FieldMappings)和值表(ValueTable)使用;拓扑检查和创建的拓扑处理;文件TXT、XLS和ArcGIS数据转换;使…

    2022年6月26日
    33
  • Centos下安装yum(完整教程)

    Centos下安装yum(完整教程)在安装yum的时候发现网上的方法参差不齐,不是很完整,以下是个人亲测,同时是总结出的最方便的方法,希望能帮助到大家!查看已安装的yumrpm-qa|grepyum删除已有的yumrpm-aq|grepyum|xargsrpm-e–nodeps下载以下安装包wgethttp://tel.mirrors.163.com/centos/7/os/x86_64/Packages/python-2.7.5-89.el7.x86_64.rpmwgethttp:.

    2022年6月4日
    178
  • Java删除文件时总是返回false,删不掉,且无异常

    Java删除文件时总是返回false,删不掉,且无异常分享知识传递快乐今天在利用File类中的delete()方法删除文件时总是返回false。查看路径文件路径正确,文件也存在。测试可以正常,唯独在项目中那是一个删不掉啊。后来与测试用例仔细比对了一下,发现有个IO类在使用,因此得出:在删除文件是因为没关闭IO,导致文件无法删除,后来加上close()就可以删除文件了。总结下可能会出现删不掉文件的几种情况:没…

    2022年5月13日
    61
  • Ntp校时客户端小工具

    Ntp校时客户端小工具Ntp校对时间是常用的计算机时间同步的方式之一,但是网上偏偏下载不到一个不带广告,且操作简单暴力的软件,其实我要的功能无非就是1:开机自动校对时间2:每隔一段时间校对时间3:可配置ntp服务器地址和校对间隔但是就是找不到一款合适自己用的工具,无奈啊,只好自己手写一个配置文件是ini,一看就懂软件下载地址:https://download.csdn.net/download/li…

    2022年6月25日
    108

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号