跨域问题及一些解决办法

一. 什么叫跨域?
    不符合同源策略的,
    (1)jd.com 请求不到baidu.com下的接口
    (2)m.taobao.com 请求不到  www.taobao.com下接口
    (3)www.baidu.com   请求不到www.baidu.com:8888  下接口
    (4)http://www.baidu.com 请求不到  https://www.baidu.com 下的接口

同源策略:

   (1)协议相同 
  
(2)端口号相同
   (3)域名相同 (一级域名和二级域名)

浏览器阻止了跨域请求

解决跨域的方法

1.  后台代码解决跨域问题。
    加上header("Access-Control-Allow-Origin:*");

2.  jsonp跨域 (jsonp的原理)
    (1)前台动态创建script标签,src属性没有跨域问题
    (2)后台返回值有函数名字符串
注意: 这两种方式 都需要后台代码支持。
常用 :

callback =aaa
cb =aaa
jsoncallback =aa

后台php代码:

<?php
    //header 是设置响应头的函数, 加上下面的键值对后, 就是告诉浏览器不需要 阻止跨域。
       
//    header("Access-Control-Allow-Origin:*");
   
    /*
     * 缺点:设置* ,之后, 所有人都可以访问, 安全性降低。
     *
     * 可以只设置一个特定域名下,来访问。
     * header("Access-Control-Allow-Origin:http://sammer.applinzi.com");
     * */
//-------------------------------------------------------------------------------------------------

$name = $_GET["cb"]; //得到前台get请求传的参数
    
//        $_POST["mydata"]     //得到嵌套post请求的数据
    //$name 结果是 ****

echo $name."({name:‘kerwin‘})";  // php 中的“ .”  相当于 js 中“+” 进行字符串拼接。
//    echo "test2({name:‘kerwin‘})";
?>

jsonp(原生js):

<body>
    <input type="button" value="请求数据" id="send"/>
  
    <script>
      function test2(result){
          console.log(result);
      }
    </script>

<script>
        var oinput = document.getElementById("send");

oinput.onclick = function(){
          //动态创建script标签
          var oscript = document.createElement("script");

//src属性无跨域限制
          oscript.src= "http://kerwin.applinzi.com/jsonptest.php?cb=test2";
          //以上接口返回值是 test2({后台想要给前台的数据}) 这就是方法调用,只要本地有这个方法,就能成功传参调用
          document.body.appendChild(oscript);
       
          //当调用结束 ,就移除动态创建的script标签。
          oscript.onload = function(){
             document.body.removeChild(oscript);
          } 
        }

</script>

<script>
      // 等价于上面的请求
      // test("aaaa");
    </script>
</body>

jsonp(jquery封装的方法):

<body>
    <input type="button" value="请求数据" id="send"/>

<script>
    $("#send").click(function(){
        $.ajax({
            url:"http://kerwin.applinzi.com/jsonptest.php",
            dataType:"jsonp",
            jsonp:"cb",
            success:function(data){
                console.log(data);
            }
        })
    })
    </script>
</body>

百度支持jsonp的一个接口

<body>
    <input type="text" id="myinput">
    <input type="button" value="请求数据" id="send"/>
    <ul id="box"></ul>
    <script>

$("#send").click(function(){
            /*
                (1)jsonp(动态创建script标签) 跟ajax (new XMLHTTPRequest())没有关系
                (2)jQuery 虽然封装在一起, 但要注意没有关系
            */
            $.ajax({
                url: "https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=" +$("#myinput").val(),
                dataType:‘jsonp‘,
                jsonp:"cb",
                success:function(result){
                    console.log(result);
                }
            })
        })

//  oninput 只要输入框value值发生改变, 就会调用

$("#myinput").on("input",function(){
            $("#box").empty();//清空当前dom下的节点。
            $.ajax({
                url:"https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd="+$("#myinput").val(),
                dataType:‘jsonp‘,
                jsonp:"cb",
                success:function(result){
                   $.each(result.s,function(index,item){
                        var li =$("<li>").html(item);
                        $("#box").append(li);
                   })
                }
            })
          })

// $("#myinput").get(0).oninput = function(){
        //     console.log(111);
        // }
    </script>
</body>

时间: 2024-08-03 09:19:58

跨域问题及一些解决办法的相关文章

ajax 跨域无法携带cookie 解决办法

ajax 跨域无法携带cookie,需要用到session,终于完美结局 xhrFields: { withCredentials: true }, 添加这个可能是大家都会做的一件事 但是添加上了之后就出现了另外一个问题 The 'Access-Control-Allow-Origin' header contains the invalid value 'Origin'. Origin ...... 2.服务器server端要配置Access-Control-Allow-Credentials

ASP.NET中Cookie跨域的问题及解决代码

ASP.NET中Cookie跨域的问题及解决代码 http://www.liyumei.net.cn/post/share18.html Cookies揭秘  http://www.cnblogs.com/zhangziqiu/archive/2009/08/06/cookies-javascript-aspnet.html 最近在项目开发中遇到一个很棘手的问题,一个用户在顶级域名登录后,跳转到自己所拥有的二级域名下管理二级网站时,cookie丢失了,一直找解决办法找了整整两天,百度谷歌一大堆,

【Todo】JS跨域访问问题的解决

做双十一,需要在主会场页面,嵌入我们产品的JS豆腐块.而这个豆腐块需要调用我们后端的数据接口,涉及跨域访问. 参考 http://www.cnblogs.com/2050/p/3191744.html 方案1: 在js中,我们虽然不能直接用XMLHttpRequest请求不同域上的数据时,但是在页面上引入不同域上的js脚本文件却是可以的,jsonp正是利用这个特性来实现的. jquery的jsonp形式: 服务器端如下: protected void Page_Load(object sende

不同类型的数据跨表空间迁移的解决办法

http://blog.csdn.net/passion_wang/article/details/6541369 Oracle10g数据跨表空间迁移 因某些开发人员由于对oracle数据库理解的不够深入,往往在建表的时候指定了当前用户非默认的表空间,这样就导致了在exp及imp等操作时候问题很多,因此需要将这些表及相关的数据迁移回当前用户的默认表空间里.Oracle10g数据数据库提供了一个Move命令可以把这样的数据对象进行跨表空间的迁移,也可以对含有BLOB.CLOB这样的二进制大字段的表

iframe 跨域自适应 纯css解决方法

<style type="text/css">body{background:#f00;}body, html,#ifm1{width:100%;height:100%;overflow:hidden;margin:0;}#ifm1{width:100%;height:100%;overflow:hidden;margin:0;}</style><iframe id="ifm1" src='http://www.csdn.net' fr

Ajax跨域请求以及乱码解决

Ajax跨域请求2种解决方法 1 ) 什么叫跨域请求,协议,域名,端口号,其中一样不同都称跨域; 第一种:使用script标签发送请求; //创建一个script标签; var v_element=document.createElement("script"); //设置script的type 属性; v_element.type="text/javascript"; //设置src属性; v_element.src="http://127.0.0.1:

canvas.toDataURL 由于跨域报错的解决方法

关于canvas.toDataURL 由于跨域报错的解决方法 用过canvas,都知道toDataURL这个方法真好用,不仅合成图片用到它,压缩图片也用到它.但有一个问题,就是图片源不能跨域,不然会报错: Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported. 解决方法,相信大家都知道了,就是在图片img加上crossOri

JS 跨域认识及如何解决

什么是跨域 指的是浏览器不允许javascrip脚本向其他域名发起ajax请求. 跨域的各种情况判定 URL 说明 是否允许通信 http://www.a.com/a.js http://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.js http://www.a.com/script/b.js 同一域名下不同文件夹 允许 http://www.a.com:8000/a.js http://www.a.com/b.js 同一域名,不同端口 不允许

ubuntu 搜索域 访问域不成功的解决办法

为了找到这个问题走了好多的弯路,如果你用的ubuntu访问不了本地local的域那么你请看下面的解决办法: 在终端执行:sudo apt-get remove avahi-daemon //作用就是卸载了svshi的东东,具体做什么的你可以去百度去吧.一般人用不到的. linux上的avahi