JS基础

跨域

2019-12-26  本文已影响0人  凯凯frank

什么是跨域

跨域指JS不能访问和操作其他域下的资源。它是由浏览器的同源策略造成的,为的是加强浏览器的安全性。
同源策略:协议、域名、端口相同。
同源策略限制以下几种行为:

1.) Cookie、LocalStorage 和 IndexDB 无法读取
2.) DOM 和 Js对象无法获得
3.) AJAX 请求不能发送

解决方法

  1. JSONP: 利用 <script><img><iframe> 等标签不受同源策略限制,可以从不同的域加载并执行资源的特性,来实现数据跨域传输。
    优点:它不像XMLHttpRequest对象实现的Ajax请求那样受到同源策略的 限制;它的兼容性更好,在更加古老的浏览器中都可以运行。
    缺点:它只支持 GET 请求,而不支持 POST 请求等其他类型的 HTTP 请求。

  2. 跨域资源共享(CORS)Cross-Origin Resource Sharing
    在目标域返回的HTTP头来授权是否允许跨域访问。

response.addHeader(‘Access-Control-Allow-Origin:*’);//允许所有来源访问 
response.addHeader(‘Access-Control-Allow-Method:POST,GET’);//允许访问的方式
  1. ngnix反向代理
    部分代码:
http {
    ...
    server{
      listen 9001;#本地的端口号
      server_name localhost;
      location / {
        proxy_pass https://your_website.com;#需要反向代理的网站
        add_header Access-Control-Allow-Origin *; # *代表都可以访问,也可以指定域名
      } 
    }
}

这样配置后,本地访问localhost:9001,就和访问https://your_website.com一样

  1. postMessage
    postMessage常用于,本页面和通过本页面window.open打开的页面进行通讯,或者本页面和他内嵌的iframe进行通讯。
    简单用法:
    parent page:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <iframe src="./child.html" id="child-frame"></iframe>
    <button id="btn">click me</button>
    i am parent
    <script>
        window.onload =function () {
            var childIframe = document.getElementById('child-frame')
            var contentWindow = childIframe.contentWindow
            document.getElementById('btn').onclick = function () {
                contentWindow.postMessage("from parent", '*')
//                contentWindow.postMessage("from parent", 'http://localhost:63344')
            }
        }
    </script>
</body>
</html>

child page:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>i am child</div>
    <script>
        window.onload = function () {
            window.addEventListener("message", function (event) {
                console.log(event, event.data)
            }, false);
        }
    </script>
</body>
</html>
上一篇 下一篇

猜你喜欢

热点阅读