美文网首页
跨域/同源笔记

跨域/同源笔记

作者: fejavu | 来源:发表于2019-05-07 22:12 被阅读0次

同源策略

浏览器出于安全考虑,只允许本域下接口交互,不同源的客户端脚本在没有明确授权下,不能读写对方的资源。

  • 同协议,如http或者https
  • 同域名,如都是google.com/index.html,google.com/another
  • 同端口,80端口

同源例子:
google.com/ai,google.com/bigdata

不同源例子:

跨域方法

JSONP

以 script 标签加载数据的方式绕过同源策略,后端返回数据时拼接函数,将返回数据作为拼接函数的参数,数据返回后执行该函数。

<script>
showData(string) {
  console.log(JSON.parse(string));
}
</script>
<script 
src="http://google.com/ai.js?callback = showData">
</script>

CORS

CORS,cross-origin resourse sharing,支持现在浏览器,IE10以上。

在后端加上这句话:

// allow all request of cross origin
res.setHeader('Access-Control-Allow-Origin','*');
// allow only the request of  'example.com:8080' 
res.setHeader('Access-Control-Allow-Origin','example.com:8080');

postMessage

iframe 域名和当前域名跨域。

$('.main input').addEventListener('input', function() {
  windows.parent.postMessage(this.value, '*');
})

window.addEventListener('message', function(e) {
  $('#input').value = e.data;
  console.log(e.data);
})

实践检验

在本地写一个html,地址是 http://localhost/index.html
,放置一个 button,点击后向http://127.0.0.1:80请求,此时两个文件不同域名,因此处于跨域,运用 CORS,cross-origin resourse sharing 方法,通过服务器端设置一个跨域允许,从而将服务器端数据返回到不同源请求。

html 客户端

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <button>show something</button>
  <script>
    function $(selector) {
      return document.querySelector(selector);
    }

    $('button').onclick = function() {
      console.log('clicked');
      var xhr = new XMLHttpRequest();
      xhr.open('GET', 'http://127.0.0.1:80/getst',true);
      xhr.send();
      xhr.onload = function(){
        var resP = document.createElement('p');
        resP.innerHTML = JSON.parse(xhr.responseText)
        $('body').appendChild(resP);
        // console.log(JSON.parse(xhr.responseText));
      }
    }
  </script>
</body>
</html>

server 端

var http = require('http');
var fs = require('fs');
var path = require('path');
var url = require('url');

http.createServer(function(req, res) {
  var pathObj = url.parse(req.url,true);

  switch(pathObj.pathname) {
    case '/getst':
      var something = "This is a cross origin response via a request";
      res.setHeader('Access-Control-Allow-Origin', 'http://localhost');
      res.end(JSON.stringify(something));
      break;
    default:
      fs.readFile(path.join(__dirname,pathObj.pathname), function(e,data){
        if(e){
          res.writeHead(404,'not found');
          res.end("<h1>404 Not Found</h1>");
        }else {
          res.end(data);
        }
      })
  }
}).listen(80);
请求成功示意

可以看到,请求的客户端域名是:localhost/index.html,而请求的地址是:http://127.0.0.1:80,两者是跨域的,而在服务器端设置

res.setHeader('Access-Control-Allow-Origin', 'http://localhost');

就是允许http://localhost进行跨域请求,因此请求成功。如果将这行去掉,这回造成非同源拦截:

非同源拦截

相关文章

  • 网站跨域解决方法

    关键词 同源策略 什么是跨域 跨域,请求不同源。同源指协议、域名、端口都相同,只要有一样不相同就是跨域了。 同源限...

  • JSONP、CORS、跨域

    跨域 同源:两个文档同源需满足:协议、域名、端口相同跨域:不同域之间相互请求资源,就算作“跨域“。js进行DOM操...

  • 跨域/同源笔记

    同源策略 浏览器出于安全考虑,只允许本域下接口交互,不同源的客户端脚本在没有明确授权下,不能读写对方的资源。 同协...

  • 通过script标签实现跨域

    跨域 什么是跨域? 跨域问题是由于javascript语言安全限制中的同源策略造成的。同源策略是由Netscape...

  • H5跨域访问

    跨域访问是源于浏览器的同源策略而引申出来的概念 1、先了解什么是同源策略和跨域访问 同源策略、跨域解决方案 - R...

  • 跨域

    什么是跨域? 说跨域之前先要谈几个概念。跨域问题要从同源策略谈起,那什么是同源策略呢?同源是下面三项都相同,缺一不...

  • 有关跨域的相关问题和方法

    跨域是什么 同源策略 在讲解什么是跨域之前先要清楚什么是同源策略,“同源政策”(same-origin polic...

  • H5 知识点 - 收藏集 - 掘金

    跨域解决方案总结 - 前端 - 掘金为什么需要跨域? 就得先知道同源策略. 同源策略 同源策略是为了保证数据的安全...

  • 同源策略和跨域

    什么是跨域问题? 为什么会出现跨域问题? 因为浏览器的同源策略(同源指的是:协议+域名+端口相同)。 同源策略是浏...

  • js常见跨域解决方案

    参考:前端常见跨域解决方案(全) 跨域,什么是“域”? 这里就要先说说同源策略了。所谓同源是指"协议+域名+端口"...

网友评论

      本文标题:跨域/同源笔记

      本文链接:https://www.haomeiwen.com/subject/luhuoqtx.html