美文网首页
利用CORS实现跨域

利用CORS实现跨域

作者: BitterOutsider | 来源:发表于2019-01-27 17:07 被阅读4次

一、同源策略与跨域

Ⅰ 什么是同源

  1. 相同的协议
  2. 相同的域名
  3. 相同的端口

Ⅱ 什么是同源策略

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

Ⅲ 什么是跨域

简单的来说,就是绕过同源策略获取数据

二、利用CORS实现跨域

Ⅰ 什么是CORS

CORS 全称是跨域资源共享(Cross-Origin Resource Sharing),是一种 ajax 跨域请求资源的方式,支持现代浏览器,IE支持10以上。 实现方式很简单,当你使用 XMLHttpRequest 发送请求时,浏览器发现该请求不符合同源策略,会给该请求加一个请求头:Origin,后台进行一系列处理,如果确定接受请求则在返回结果中加入一个响应头:Access-Control-Allow-Origin; 浏览器判断该相应头中是否包含 Origin 的值,如果有则浏览器会处理响应,我们就可以拿到响应数据,如果不包含浏览器直接驳回,这时我们无法拿到响应数据。所以 CORS 的表象是让你觉得它与同源的 ajax 请求没啥区别,代码完全一样。

Ⅱ 实现

为了实现该效果,我们在host文件中加入a.com 127.0.0.1b.com 127.0.0.1

  1. 写一个简易服务
var http = require('http')
var fs = require('fs')
var url = require('url')
var path = require('path')

http.createServer(function(req,res){
  var pathobj = url.parse(req.url,true)
  switch(pathobj.pathname){
    case '/getNews':
      var news = [
        'hello world',
        'hello javascript',
      ]
      res.setHeader('Access-Control-Allow-Origin','http://a.com:8080')
      //res.setHeader('Access-Control-Allow-Origin','*')
      res.end(JSON.stringify(news))
      break;
    default:
      fs.readFile(path.join(__dirname,pathobj.pathname),function(e,data){
        if(e){
          res.writeHead(404,'not found')
          res.end('<h1>404</h1>')
        }
        else{
        res.end(data)
        }
      })
  }
}).listen(8080)

注意到:这里多写了一个响应头res.setHeader('Access-Control-Allow-Origin','http://a.com:8080')

  1. 用Ajax请求数据
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <div class="container">
    <ul class="news"></ul>
    <button class="button">button</button>
  </div>
  <script>
    function $(selector){
    return document.querySelector(selector)
    }
    $('.button').addEventListener('click',function(){
      var xhr = new XMLHttpRequest()
      xhr.open('GET','http://a.com:8080/getNews',true)
      xhr.send()
      xhr.onload = function(){
        appendHtml(JSON.parse(xhr.responseText))
      }
    })
    function appendHtml(news){
      var html = ''
      for(var i in news){
        html += '<li>' + news[i] + '</li>'
      }
      $('.news').innerHTML = html
    }
  </script>
</body>
</html>

成功获取了服务器数据


且有响应头

如果我们访问的是http://b.com:8080/index.html则无法获取想要的数据,因为在服务中没有设置res.setHeader('Access-Control-Allow-Origin','http://b.com:8080')

相关文章

网友评论

      本文标题:利用CORS实现跨域

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