zoukankan      html  css  js  c++  java
  • 【Todo】JS跨域访问问题的解决

    做双十一,需要在主会场页面,嵌入我们产品的JS豆腐块。而这个豆腐块需要调用我们后端的数据接口,涉及跨域访问。

    参考 http://www.cnblogs.com/2050/p/3191744.html

    方案1:

    在js中,我们虽然不能直接用XMLHttpRequest请求不同域上的数据时,但是在页面上引入不同域上的js脚本文件却是可以的,jsonp正是利用这个特性来实现的。

    jquery的jsonp形式:

    服务器端如下:
            protected void Page_Load(object sender, EventArgs e)
            {
                string callback = Request.QueryString["jsoncallback"];
    
                string result = callback + "({"name":"zhangsan","date":"2012-12-03"})";
    
                Response.Clear();
                Response.Write(result);
                Response.End();
            }
    
    客户端:
    $.ajax({ 
                    async: false, 
                    url: "http://192.168.0.5/Web/web1.aspx", 
                    type: "GET", 
                    dataType: 'jsonp', 
                    //jsonp的值自定义,如果使用jsoncallback,那么服务器端,要返回一个jsoncallback的值对应的对象. 
                    jsonp: 'jsoncallback', 
                    //要传递的参数,没有传参时,也一定要写上 
                      data: null, 
                    timeout: 5000, 
                    //返回Json类型 
                      contentType: "application/json;utf-8", 
                    //服务器段返回的对象包含name,data属性. 
                    success: function (result) { 
                        alert(result.date); 
                    }, 
                    error: function (jqXHR, textStatus, errorThrown) { 
                        alert(textStatus); 
                    } 
                });
    实际上,在我们执行这段js时,js向服务器发出了这样一个请求:
    http://192.168.0.5/Web/web1.aspx?jsoncallback=jsonp1354505244726&_=1354505244742 
    
    而服务器也相应的返回了如下对象:
    jsonp1354506338864({"name":"zhangsan","date":"2012-12-03"})
    此时就实现了跨域范文数据的要求.

    这一篇 http://blog.csdn.net/u012028371/article/details/52926487

    里面还提到了验证js节点加载的完毕:

    ie只能通过script的readystatechange属性,其它浏览器是script的load事件。

    js.onload = js.onreadystatechange = function() { if (!this.readyState || this.readyState === 'loaded' || this.readyState === 'complete') { // callback在此处执行 js.onload = js.onreadystatechange = null; } };

    方案2 

    通过修改document.domain来跨子域

    估计不行,因为我们修改不了糯米主页的domain

    方案3

    使用window.name来进行跨域 (这个主要解决的跳转页面前后数据关联)

     

  • 相关阅读:
    JS定时器做物体运动
    JS做动态表格
    JS如何做2048(详细)
    改变 C/C++ 控制台程序的输出颜色和样式
    The Game Of Life – 数据结构与算法的敲门砖
    适用于 macOS 下 2K 显示器开启 HiDPI 的简便解决方案
    「踩坑记」Android API 判断权限申请结果的闪退问题
    Hello World!
    js 放大镜效果
    js 随机验证码生成及校验
  • 原文地址:https://www.cnblogs.com/charlesblc/p/5998503.html
Copyright © 2011-2022 走看看