ajax完美解决跨域问题(jsonp、nginx反向代理)

ajax完美解决跨域问题(jsonp、nginx反向代理)


做过web前端人都知道,经常会有ajax跨域问题,下面列举我经常使用的解决办法


第一种:使用jsonp,jQuery的ajax方法支持jsonp,但是最大的缺点就是只支持get方式,而且服务端也要修改

客户端 test.html代码

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4.     <title>工作端</title>  
  5.     <meta name="viewport" content="width=device-width,initial-scale=1.0">  
  6.     <meta charset="utf-8">  
  7.     <script src="jquery-1.10.2.min.js"></script>  
  8.     <style>  
  9.     </style>  
  10. </head>  
  11.   
  12. <body>  
  13. <input type="button" value="测试" id="demo">  
  14. <div id="result">  
  15.   
  16. </div>  
  17. <script>  
  18. $(document).ready(function() {  
  19.     var cache = {};  
  20.     $("#demo").click(function(){  
  21.         $.ajax({  
  22.             type : "get",   
  23.             async:false,  
  24.             data:{"name":"test001","age":"100"},  
  25.             url : "http://192.168.10.111/server.php", //跨域请求的URL  
  26.             dataType : "jsonp",  
  27.             //传递给请求处理程序,用以获得jsonp回调函数名的参数名(默认为:callback)  
  28.             jsonp: "callback",  
  29.             //自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名  
  30.             jsonpCallback:"success_jsonpCallback",  
  31.                 //成功获取跨域服务器上的json数据后,会动态执行这个callback函数  
  32.             success : function(json){   
  33.                 alert(json,name);  
  34.             }  
  35.         });  
  36.     });  
  37. })  
  38. </script>  
  39. </body>  
  40. </html>  

server.php代码

[php]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?php  
  2. $arr['id']=100;  
  3. $arr['name']="小网";  
  4. $data[]=$arr;  
  5. $arr['id']=200;  
  6. $arr['name']="阿里";  
  7. $data[]=$arr;  
  8. $data=json_encode($data);  
  9. $callback = $_GET['jsoncallback'];  
  10. echo $callback."(" .$data.")";  


第二种:nginx反向代理,我的nginx版本nginx-1.10.0

首先在 conf\apiserver-reverse-proxy-conf\bingli\main.conf ,没有相关目录和文件就新建

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. location ~* ^/uc/.*{  
  2.     proxy_set_header Host $host;  
  3.     proxy_set_header X-Real-Ip $remote_addr;  
  4.     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
  5.     proxy_pass http://192.168.10.111:8080;  
  6. }  


然后在nginx主配置文件添加加粗内容,即把代理文件加载进来
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. location / {  
  2.             root   html;  
  3.             index  index.html index.htm;  
  4.         }  
  5. include apiserver-reverse-proxy-conf/bingli/main.conf;  

重启nginx,之后ajax发请求到

http://localhost/uc/aa
http://localhost/uc/bb?token=xxxx
都会被转发到
http://192.168.10.111:8080/uc/aa
http://192.168.10.111:8080/uc/bb?token=xxxx


附上自己的bug修复方案

nginx

location /v2/wintelapi/api/agent/free {
 16      #root     /usr/work/tool/webroot/;
 17      #rewrite  ^/(.*)$  /_upload/index.php  break;
 18      proxy_set_header Host m.icsoc.net;
 19      proxy_set_header X-Real-Ip $remote_addr;
 20      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 21      proxy_pass http://182.92.31.130;
 22 }

js

$('#btn_consultinner').click(function () {
    $.ajax({
        //url: wincall.opts.wintelapi_url + '/v2/wintelapi/api/agent/free',
        url:'/v2/wintelapi/api/agent/free',
        data: {vcc_code: wincall.opts.vcc_code},
        dataType: 'jsonp',
        timeout: 5000,
        async: false,
        jsonp: 'jsonpcallback',
        success: function (response) {
            var resCode = response.code || '';
            if (resCode == 200) {
                var resData = response.data || {};
                var $tbody = $('#tbody');
                $.each(resData, function (index, value) {
                    $tbody.empty();
                    if (value.ag_num != wincall.loginInfo.agentNum) {
                        var $tr = $('<tr><td>' + value.ag_id + '</td><td>' + value.ag_num + '</td><td>' + value.ag_name + '</td><td>' + value.pho_num + '</td></tr>');
                        $tbody.append($tr);
                        $tr.on('click', function () {
                            wincall.fn_consultinner(value.ag_id);
                            $('#free-agent-modal').modal('hide');
                        });
                    }
                });
            } else {
                wincall.log(response);
            }
        }
    });
    $('#free-agent-modal').modal({});
});





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值