跨域

什么是跨域

只要协议、域名、端口有任何一个不同,都被当作是不同的域,之间的请求就是跨域操作,如果请求的数据不是同源,则请求会报错。
这里写图片描述

http://www.baidu.com:8080/index 做对比

url结果原因
http://www.baidu.com:8080/index2同源协议号主机名端口号相同
https://www.baidu.com:8080/index不同源协议号不同
http://www.jingdong.com:8080/index不同源主机名不同
http://www.baidu.com:8000/index不同源端口号不同

跨域方法

JSONP

JSONP的跨域方法是用script标签内联的形式来跨域。
以请求 https://api.douban.com/v2/book/1220562 为例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="public/javascripts/jquery-3.2.1.min.js"></script>
</head>
<body>
    <script>
        function cb(data){
            console.log(data);
        }

    </script>
    <script src="https://api.douban.com/v2/book/1220562?callback=cb"></script>
</body>
</html>

这里我们预先定义了函数cb,从api传来的数据会进入cb函数中,然后执行
执行结果:
这里写图片描述

当然 jQuery 也封装了jsonp跨域方法

$.getJSON('https://api.douban.com/v2/book/1220562?callback=?', function(json, textStatus) {
                /*optional stuff to do after success */
                console.log(json)
         });

这里getJSON方法可以不用预先定义函数,从api返回的数据会直接执行后面的function(json,textStatus)

服务器代理

之前我想跨域使用JSONP访问 图虫的API https://api.tuchong.com/feed-app,但是返回的数据是纯json格式,所以不支持JSONP方法获得数据。所以只能用服务器代理(用express搭建服务器),具体方法如下:

1.安装依赖

这里写图片描述
这里引入 http-proxy-middleware 组件,并且作用中间件就可以代理 https://api.tuchong.com/,这里我们的端口号为http://localhost:8000,这里我们使用 http://localhost:8000/feed-app 就可以访问到我们图虫的api地址并且拿到数据。

2.前台

<!DOCTYPE html>
<html>
  <head>
    <title>Document</title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <!-- <h1><%= title %></h1>
    <p>Welcome to <%= title %></p> -->
    <button id="btn">CLICK ME</button>
    <script src="/javascripts/jquery-3.2.1.min.js"></script>
    <script>
        jQuery(document).ready(function($) {
         $('#btn').click(function(event) {
             /* Act on the event */
             $.ajax({
                 url: 'http://localhost:8000/feed-app',
                 type: 'get',
                 dataType: 'json',
             })
             .done(function(data) {
                 console.log(data);
             })
             .fail(function() {
                 console.log("error");
             })
             .always(function() {
                 console.log("complete");
             });

         }); 
        });
    </script>
  </body>
</html>

效果:
这里写图片描述

window.name

window 对象中有一个name属性,该属性的特征:即在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个window.name。
比如一个页面为 1.html,代码为:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script>
        window.name = '1.html 的值';
        setTimeout(function(){
            window.location = '2.html';
        },2000);
    </script>
</body>
</html>

页面2.html,代码为:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script>
        console.log(window.name);
    </script>
</body>
</html>

2秒后,1.html页面的window.name属性传给了2.html
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值