zoukankan      html  css  js  c++  java
  • js之跨域

    什么是跨域?
        协议+域名+端口
        跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的。
    
    什么是同源策略?
    同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。
    
    同源策略限制以下几种行为:
    
        1.) Cookie、LocalStorage 和 IndexDB 无法读取
        2.) DOM 和 Js对象无法获得
        3.) AJAX 请求不能发送
    
    
    跨域解决方案
         1、 通过jsonp跨域
        2、 document.domain + iframe跨域
        3、 location.hash + iframe
        4、 window.name + iframe跨域
        5、 postMessage跨域
        6、 跨域资源共享(CORS)
        7、 nginx代理跨域
        8、 nodejs中间件代理跨域
        9、 WebSocket协议跨域
    
    
    方法一:jsonp函数
    
        服务端
    protected void retJSON(){
        string callback = Request.QueryString["jsoncallback"];
        string result = callback + "({"name":"hofmann","date":"2019-05-08"})";
        Response.Clear();
        Response.Write(result);
        Response.End();
    }
    
        客户端
    
        $.ajax({ 
            async: false, 
            url: "http://192.168.0.5/APi/Js", 
            type: "GET", 
            dataType: 'jsonp', 
            jsonp: 'jsoncallback', 
            data: null, 
            timeout: 5000, 
            contentType: "application/json;utf-8", 
            success: function (result) { 
                alert(result.date); 
            }, 
            error: function (jqXHR, textStatus, errorThrown) { 
                alert(textStatus); 
            } 
        });
    
    在HTML DOM中,Script标签是可以跨域访问服务器上的数据的.因此,可以指定script的src属性为跨域的url,基于script标签实现跨域.
    script标签本身就可以访问其它域的资源,不受浏览器同源策略的限制,可以通过在页面动态创建script标签。
    
    这样通过动态创建script标签加载其它域的js文件,然后通过本页面调用加载后js文件的函数,这样做的缺陷是不能加载其它域的文档,只能是js文件,jsonp便是通过这种方式实现的,jsonp通过向其它域传入一个callback参数,通过其他域的后台将callback参数值和json串包装成javascript函数返回,因为是通过script标签发出的请求,浏览器会将返回来的字符串按照javascript进行解析执行,实现域与域的数据传输。 
    jquery中对jsonp的支持也是基于此方案。
    例如:服务器返回的数据不能是单纯的如{“Name”:”hofmann”}字符串,我们是没有办法引用这个字符串的.所以,要求返回的值是var json={“Name”:”zhangsan”},或json({“Name”:”zhangsan”})
    
    
    
    方法二:iframe实现跨域
    基于iframe实现的跨域要求两个域具有aa.xx.com,bb.xx.com这种特点,
    也就是两个页面必须属于同一个顶级基础域(例如都是xxx.com,或是xxx.com.cn),
    使用同一协议(例如都是 http)和同一端口(例如都是80),这样在两个页面中同时添加document.domain,就可以实现父页面调用子页面的函数, 方法三:后台代理方式 这种方式可以解决所有跨域问题,也就是将后台作为代理,每次对其它域的请求转交给本域的后台,本域的后台通过模拟http请求去访问其它域,再将返回的结果返回给前台,这样做的好处是,无论访问的是文档,还是js文件都可以实现跨域

    什么是跨域?
    协议+域名+端口
    跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的。

    什么是同源策略?
    同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。

    同源策略限制以下几种行为:

    1.) Cookie、LocalStorage 和 IndexDB 无法读取
    2.) DOM 和 Js对象无法获得
    3.) AJAX 请求不能发送


    跨域解决方案
    1、 通过jsonp跨域
    2、 document.domain + iframe跨域
    3、 location.hash + iframe
    4、 window.name + iframe跨域
    5、 postMessage跨域
    6、 跨域资源共享(CORS)
    7、 nginx代理跨域
    8、 nodejs中间件代理跨域
    9、 WebSocket协议跨域


    方法一:jsonp函数

    服务端
    protected void retJSON(){
    string callback = Request.QueryString["jsoncallback"];
    string result = callback + "({"name":"hofmann","date":"2019-05-08"})";
    Response.Clear();
    Response.Write(result);
    Response.End();
    }

    客户端

    $.ajax({
    async: false,
    url: "http://192.168.0.5/APi/Js",
    type: "GET",
    dataType: 'jsonp',
    jsonp: 'jsoncallback',
    data: null,
    timeout: 5000,
    contentType: "application/json;utf-8",
    success: function (result) {
    alert(result.date);
    },
    error: function (jqXHR, textStatus, errorThrown) {
    alert(textStatus);
    }
    });

    在HTML DOM中,Script标签是可以跨域访问服务器上的数据的.因此,可以指定script的src属性为跨域的url,基于script标签实现跨域.
    script标签本身就可以访问其它域的资源,不受浏览器同源策略的限制,可以通过在页面动态创建script标签。

    这样通过动态创建script标签加载其它域的js文件,然后通过本页面调用加载后js文件的函数,这样做的缺陷是不能加载其它域的文档,只能是js文件,jsonp便是通过这种方式实现的,jsonp通过向其它域传入一个callback参数,通过其他域的后台将callback参数值和json串包装成javascript函数返回,因为是通过script标签发出的请求,浏览器会将返回来的字符串按照javascript进行解析执行,实现域与域的数据传输。
    jquery中对jsonp的支持也是基于此方案。
    例如:服务器返回的数据不能是单纯的如{“Name”:”hofmann”}字符串,我们是没有办法引用这个字符串的.所以,要求返回的值是var json={“Name”:”zhangsan”},或json({“Name”:”zhangsan”})

    方法二:iframe实现跨域
    基于iframe实现的跨域要求两个域具有aa.xx.com,bb.xx.com这种特点,也就是两个页面必须属于同一个顶级基础域(例如都是xxx.com,或是xxx.com.cn),使用同一协议(例如都是 http)和同一端口(例如都是80),这样在两个页面中同时添加document.domain,就可以实现父页面调用子页面的函数,


    方法三:后台代理方式
    这种方式可以解决所有跨域问题,也就是将后台作为代理,每次对其它域的请求转交给本域的后台,本域的后台通过模拟http请求去访问其它域,再将返回的结果返回给前台,这样做的好处是,无论访问的是文档,还是js文件都可以实现跨域

  • 相关阅读:
    Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging
    KDiff3使用指南
    Win10解决修改host没有权限问题(其他文件同理) 一步都不能少哦:先添加再授权
    微信小程序
    MyBatisSystemException 【exception】
    [LeetCode] Additive Number 加法数
    [CareerCup] 14.5 Object Reflection 对象反射
    C Memory Layout C语言中的内存布局
    strtol 函数用法
    [CareerCup] 14.4 Templates Java模板
  • 原文地址:https://www.cnblogs.com/zjz666/p/11546312.html
Copyright © 2011-2022 走看看