通用跨域请求代理文件

<script type="text/javascript">
document.domain = 'test.cn';

var $ = {}; 
$.xho = function () { //创建xmlhttprequest对象 
    var http_request = null; 
    if (window.XMLHttpRequest) { //Mozilla 浏览器 
        http_request = new XMLHttpRequest(); 
        if (http_request.overrideMimeType) {//设置MIME类别 
            http_request.overrideMimeType("text/xml"); 
        } 
    } 
    else if (window.ActiveXObject) { //IE浏览器 
        try { 
            http_request = new ActiveXObject("Msxml2.XMLHTTP"); 
        } catch (e) { 
            try { 
                http_request = new ActiveXObject("Microsoft.XMLHTTP"); 
            } catch (e) { } 
        } 
    } 
    return http_request; 
};

$.rsc = function (obj, callfunc) { 
    return function () { 
        if (obj.readyState == 4) { 
            if (obj.status == 200) { 
                callfunc(obj.responseText); 
            } 
        } 
    };
};

$.GET = function (url, callfunc) { 
    var xho = $.xho(); 
    if (xho == null) return; 
    xho.onreadystatechange = $.rsc(xho, callfunc); //设置回调函数 
    //第三个参数指定在等待服务器返回信息的时间内是否继续执行下面代码,如果为true,则不会继续执行,默认为true 
    xho.open("GET", url, true); 
    xho.setRequestHeader("X-Requested-With", "XMLHttpRequest");
    xho.send(null); 
};

$.POST = function (url, data, callfunc) {
    var xho = $.xho(); 
    if (xho == null) return; 
    xho.onreadystatechange = $.rsc(xho, callfunc); //设置回调函数 
    xho.open("POST", url, true); 
    xho.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); //post请求必须修改MIME类别 
    xho.setRequestHeader("X-Requested-With", "XMLHttpRequest");
    xho.send(data); 
};

function call(func, param)
{
    func = eval('parent.window.' + func);
    func(param);
}


function isJson(obj){
    var isjson = typeof(obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length;    
    return isjson;
}

function isEmpty(obj) {
    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            return false;
    }
    return true;
}

function json2Query(params) {
    tail = [];
    for (var p in params) {
        if (params.hasOwnProperty(p)) {
            tail.push(p + "=" + encodeURIComponent(params[p]));
        }
    }
    return tail.join("&")
}

var invokeApi = function(api, param, method, callback) {
    var m = (!method || method.toLowerCase() == 'get') ? 'get' : 'post';
    if ('get' == m) {
        debugger
        if (isJson(param) && ! isEmpty(param)) {
            param = json2Query(param);
        }

        if (param) {
            api = (api.indexOf('?') == -1) ? api + '?' + param : api  + '&' + param;
        }


        $.GET(
            api,
            function(data){
                call(callback, data);
            }
        )
    } else {
        if (isJson(param)) {
            param = json2Query(param);
        }
        $.POST(
            api,
            param,
            function(data) {
                call(callback, data);
            }
        )
    }
}

</script>

 说明:比如 a.test.cn的js想发送请求到 b.test.cn,这时只需要在 b.test.cn 的根目录新增一个 proxy.html ,内容为上面的代码。然后在 a.test.cn 下新建一个html文件,内容如下:

<script type="text/javascript">

mod = {};

mod.submod = function() {

    var ifr_win = '';

    var init = function() {
        load_iframe();
    }

    var load_iframe = function() {
            document.domain = 'test.cn';
            var ifr = document.createElement('iframe');
            ifr.src = 'http://b.test.cn/proxy.html';
            ifr.style.display = 'none';
            ifr.id = 'proxy_ifr';
            document.body.appendChild(ifr);
            ifr.onload = function() {
                ifr_win = ifr.contentWindow;
            };
    };

    var cb = function(msg) {
        console.log(msg);
    }

    var get_dl = function() {
        ifr_win.invokeApi(
            'http://b.test.cn/ajax/dl',
            {"id":13082, "from":"office", "app":"helper", "file_type":1},
            'POST',
            'mod.submod.cb'
        );
    }

    var get_preview = function() {
        ifr_win.invokeApi(
            'http://b.test.cn/ajax/preview',
            {"mb_id":12269, "moban_type":"2", "app":"helper", "file_type":2},
            'GET',
            'mod.submod.cb'
        );
    }

    return {
            init : init,
            cb : cb,
            get_dl : get_dl,
            get_preview : get_preview
    };
}();

mod.submod.init();

setTimeout("mod.submod.get_dl()", 500);

setTimeout("mod.submod.get_preview()", 500);

</script>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Ajax是一种用于在网页上进行异步通信的技术,可以通过发送HTTP请求来获取数据或更新页面内容。然而,由于同源策略的限制,我们通常无法直接在网页上通过Ajax请求跨域的资源,包括本地的JSON文件跨域请求本地的JSON文件并不常见,因为同源策略主要用于防止恶意行为和安全问题。但是有时我们可能遇到需要跨域请求本地JSON文件的情况,例如在开发过程中需要模拟服务器返回的数据。 要实现跨域请求本地的JSON文件,可以通过以下几种方式: 1. JSONP(JSON with Padding) JSONP是一种通过动态创建<script>标签,实现跨域访问的方法。在本地JSON文件中,我们可以通过在JSON数据外面包裹一个函数调用来返回数据。 例如,在本地JSON文件中添加如下代码: ```javascript jsonpCallback({"name": "John", "age": 25}); ``` 然后在网页上使用Ajax请求: ```javascript function jsonpCallback(data) { console.log(data); } var script = document.createElement('script'); script.src = 'local.json?callback=jsonpCallback'; document.body.appendChild(script); ``` 这样就可以通过JSONP方式跨域请求并获取本地的JSON数据。 2. CORS(Cross-Origin Resource Sharing) CORS是一种通过在服务器端设置响应头来实现跨域访问的方法。在本地JSON文件中,我们需要在服务器端设置Access-Control-Allow-Origin响应头,允许指定域名的跨域请求。 例如,在服务器端的响应头中添加如下代码: ```javascript Access-Control-Allow-Origin: http://example.com ``` 然后在网页上使用Ajax请求: ```javascript var xhr = new XMLHttpRequest(); xhr.open('GET', 'local.json', true); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { var data = JSON.parse(xhr.responseText); console.log(data); } }; xhr.send(); ``` 这样就可以通过CORS方式跨域请求并获取本地的JSON数据。 总结:通过使用JSONP或CORS方式,我们可以实现跨域请求本地的JSON文件JSONP通过创建<script>标签,而CORS则通过在服务器端设置响应头,使得跨域请求合法化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值