js之跨域

Posted zjz666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)
    7nginx代理跨域
    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文件都可以实现跨域

以上是关于js之跨域的主要内容,如果未能解决你的问题,请参考以下文章

JS504- HTML5 之跨域通讯(postMessage)

php 之跨域上传图片

前端之跨域

浏览器未在启用 CORS 的情况下跨域跨域发送 cookie

Spring BootSpring Boot之跨域解决方案

springboot之跨域访问cros,@CrossOrigin注解