我们模拟一个跨域的请求,一个是8888,一个是8887
//server.js
const http = require('http');
const fs = require('fs');
http.createServer(function(req,res){
  console.log('req come', req.url);
  const html = fs.readFileSync('test.html', 'utf8');
  res.writeHead(200,{
    'Content-Type': 'text/html'
  })
  res.end(html);
}).listen(8888);
//server2.js
const http = require('http'); http.createServer(function(req,res){
  console.log('req come', req.url);
  res.end('123');
}).listen(8887);

然后分别启动这两个服务

<!--test.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>
    <script>
      var xhr = new XMLHttpRequest();
      xhr.open('GET', 'http://127.0.0.1:8887');
      xhr.send();
    </script>
  </body>
</html>
html里面发送了一个8887的get请求,在server 8888端口里面读取了html的内容并发送8887的请求,就制造了一个跨域请求
一、跨域-设置 "Access-Control-Allow-Origin"
请求以后,控制台提示,No 'Access-Control-Allow-Origin' ,'Access-Control-Allow-Origin' 是什么呢?就是服务端允许跨域的头,要怎么设置才能让这个跨域请求生效呢?
// server2.js
const http = require('http'); http.createServer(function(req,res){
  console.log('req come', req.url);
  res.writeHead(200, {
    'Access-Control-Allow-Origin': '*'
  })
  res.end('345');
}).listen(8887);
在server2.js里面设置这个请求头,再从8888里面请求,发现8888里面会开始请求8887,并且没有报错了,这个*是代表所有的网站都可以跨域请求8887,我们可以限制域名,比如'Access-Control-Allow-Origin': 'http://localhost:8888',这里只能设置一个值,不能设置多个,那么想设置多个怎么办呢?可以设置一个值,动态的去判断
这就是符合期望的跨域状态,这里就有一个概念,我们就这么一个操作,就可以使这个跨域请求让server2接受,其实不管server2有没有接受这个请求,8888都会去发送这个8887的请求,只是没看到这个头,会把请求返回内容给忽略掉,在curl并没有这样的限制,这是浏览器跨域的限制
二、跨域-jsonp
是否只有通过这种方式实现跨域呢,显然不是,因为我们知道json这样一个实现方法,那jsonp到底做了什么呢?我们来看一下,8888端口的内容不变
//server2.js
const http = require('http');
http.createServer(function(req,res){
  console.log('req come', req.url);
  res.end('345');
}).listen(8887);
server2里面去除掉Access-Control-Allow-Origin,test.html请求的方式改掉
<!--test.html-->
<body>
  <!-- <script>
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'http://127.0.0.1:8887');
    xhr.send();
  </script> -->
  <script src="http://127.0.0.1:8887"></script>
</body>
再重启8887服务,发现请求使正常发送,也是正常返回的,这是因为,浏览器允许js的跨域请求,他并不在乎跨域的头,所以可以在script里面的代码是一段可执行的js代码,然后去调用jsonp,在发起请求之前,他给我们设置的一些内容,这样就可以达到目的,这就是json的原理,利用了link,script标签的可跨域性

CORS跨域请求的限制和解决的更多相关文章

  1. Spring Boot Web应用开发 CORS 跨域请求支持:

    Spring Boot Web应用开发 CORS 跨域请求支持: 一.Web开发经常会遇到跨域问题,解决方案有:jsonp,iframe,CORS等等CORS与JSONP相比 1. JSONP只能实现 ...

  2. 4 伪ajax:jsonp、cors 跨域请求

    一.同源策略 https://www.cnblogs.com/yuanchenqi/articles/7638956.html 同源策略(Same origin policy)是一种约定,它是浏览器最 ...

  3. CORS跨域请求总结

    CORS跨域请求分为简单请求和复杂请求. 1. 简单请求: 满足一下两个条件的请求. (1) 请求方法是以下三种方法之一: HEAD GET POST (2)HTTP的头信息不超出以下几种字段: Ac ...

  4. CORS跨域请求规则以及在Spring中的实现

    CORS: 通常情况下浏览器禁止AJAX从外部获取资源,因此就衍生了CORS这一标准体系,来实现跨域请求. CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origi ...

  5. 记一次 CORS 跨域请求出现 OPTIONS 请求的问题及解决方法

    今天前后端在联调接口的时候,发生了跨域请求资源获取不到的问题. 首先说明下跨域问题的由来.引自HTTP 访问控制 的一段话: 当 Web 资源请求由其它域名或端口提供的资源时,会发起跨域 HTTP 请 ...

  6. Java实现CORS跨域请求

    问题 使用前后端分离模式开发项目时,往往会遇到这样一个问题 -- 无法跨域获取服务端数据 这是由于浏览器的同源策略导致的,目的是为了安全.在前后端分离开发模式备受青睐的今天,前端和后台项目往往会在不同 ...

  7. CORS跨域请求

    一.问题: 服务器端代码 from flask import Flask from flask import make_response from flask import jsonify app = ...

  8. CORS跨域请求C#版

    1.什么是跨域请求:  当从A网站使用AJAX请求B网站时,就会出现跨域请求. 此时B网站能够接收到A网站发来的请求并返回相应的结果,但是浏览器拿到B网站返回的数据时检测到与当前网站的域名不同,出于安 ...

  9. django之CORS跨域请求

    对于想要利用django框架实现前后端分离,首要的问题是解决跨域请求的问题,什么是跨域请求?简单来说就是当前发起的请求的域与该请求指向的资源所在的域不一致.当协议+域名+端口号均相同,那么就是同一个域 ...

随机推荐

  1. args 、kwargs不定参数通过列表、元组、字典传递

    *args .**kwargs是不定参数的表达方法,一般用于函数形参.*args .**kwargs 作为传递参数的函数,在使用过程中,可对*args .**kwargs多个输入,但是效率或者比较麻烦 ...

  2. 锁、CAS操作和无锁队列的实现

    https://blog.csdn.net/yishizuofei/article/details/78353722 锁的机制 锁和人很像,有的人乐观,总会想到好的一方面,所以只要越努力,就会越幸运: ...

  3. php数组·的方法3-数组指针

    /* * 数组指针函数 * */ //key() current() 指针一直停在第一位 不会下移 echo '<hr>'; $arr5 = array('name' => 'hxq ...

  4. layim和Gatewayworker组合的实时通讯

    今天是第二次重新开发使用layim和Gatewayworker,但是由于第一次没有写文档,导致这一次就跟第一次一样,一头雾水,重新开始看文档研究,导致遇到一个瓶颈,怎么都过不去.所以,以这篇文章开始, ...

  5. TCP/IP协议<二>

    一.TCP/IP的标准化 1.TCP/IP的含义 一般来说,TCP/IP是利用IP进行通信时所必须用到的协议群的统称. 具体点,IP或ICMP.TCP或UDP.TELENT或FTP.以及HTTP等都属 ...

  6. DRF-->2序列化组件的使用和接口设计--get,post,put,delete&优化组件

    !!!!! !!!!! 记住这个图 !!!!! 上篇博客说道DRF序列化组件的get,只是简单的举一个实例,然而在现实生活中我们前后端进行交互的时候更多的用到了Json数据格式,这也就是说前后端交互的 ...

  7. 解决 eclipse cdt 运行时控制台乱码解决

    1 点击黑色 倒三角 按钮 选择 run configurations 2 2.1 点击new 添加 LANG = en_US 2.2 选择 replace native environment wi ...

  8. 位于XDB的服务器localhost要求用户名和密码,端口占用

    问题现象: 从MyEclipse启动部署在tomcat上的web程序后,出现如下问题: 然后访问tomcat主页(http://localhost:8080/),弹出如下对话框: 问题原因: 机器上安 ...

  9. Unicode汉字编码表以及参考源码分享

    1 Unicode编码表  Unicode只有一个字符集,中.日.韩的三种文字占用了Unicode中0x3000到0x9FFF的部分  Unicode目前普遍采用的是UCS-2,它用两个字节来编码一个 ...

  10. 【安全测试】sql注入

    SQL注入攻击是黑客对 数据库 进行攻击的常用手段之一,随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员越来越多,但是由于程序员水平及经验页参差不齐,相当大部分程序员在编写代码的时候没有 ...