跨域方法实践(jsonp,cors)

同源策略:同源策略限制了一个源(origin)中加载文本或脚本与来自其它源(origin)中资源的交互方式,这是一个用于隔离潜在恶意文件的重要安全机制。如果两个页面拥有 相同 的 协议(protocol),端口(如果指定),和 主机,那么这两个页面就属于同一个源(origin)。

1.CORS

1.起本地node服务

var http = require('http');

http.createServer(function (request, response) {

    response.writeHead(200, {
      'Content-Type': 'text/plain',
    });

    response.end('request arrive');
}).listen(516);

console.log('Server running at http://127.0.0.1:516/');
// node xxx.js

2.打开一个安全性较低的网站 直接在console中输入:

let url = 'http://127.0.0.1:516/';
let xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.send();

在这里插入图片描述
报CORS跨域问题

在node代码中加入

'Access-Control-Allow-Origin': '*'

再次发送请求

在这里插入图片描述
在这里插入图片描述
已有响应

3.若是发送为put请求

在这里插入图片描述

在node代码中加入

'Access-Control-Allow-Methods': 'GET, POST, PUT'

在这里插入图片描述
在这里插入图片描述

cors总结

cors(跨域资源共享 Cross-origin resource sharing),它允许浏览器向跨域服务器发出XMLHttpRequest请求,从而克服跨域问题,它需要浏览器和服务器的同时支持。

  1. 浏览器端会自动向请求头添加origin字段,表明当前请求来源。
  2. 浏览器端需要设置响应头的Access-Control-Allow-MethodsAccess-Control-Allow-HeadersAccess-Control-Allow-Origin等字段,指定允许的方法,头部,源等信息。
  3. 请求分为简单请求和非简单请求,非简单请求会先进行一次OPTION方法进行预检,看是否允许当前跨域请求。

2.jsonp

1.重置node服务 去掉

'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT'

2.打开之前console输入

let scriptTest = document.createElement('script');
scriptTest.type = 'text/javascript';
scriptTest.src = `http://127.0.0.1:516/`;
document.head.appendChild(scriptTest);

在这里插入图片描述
但是我们现在只是成功发送了一个跨域请求,但是我们不像XMLHttpRequest那样可以在res.responseText中拿到数据,通过jsonp我们该怎么拿到请求的数据呢?方法就是前后端约定一个callback,来传递函数名,前端通过该函数来拿到数据。前端代码修改为:

let scriptTest = document.createElement('script');
scriptTest.type = 'text/javascript';
script.src = `http://127.0.0.1:516/?callback=dataBack`;
document.head.appendChild(scriptTest);
function dataBack (res) {
  console.log(JSON.stringify(res));
  // 请求完后删除添加到页面上的script标签
  var head = document.head
  head.removeChild(script)
}

node代码更改:

var http = require('http')
var urlTool = require('url')
// json 数据
var data = {'methods': 'jsonp', 'result': 'success'};

http.createServer(function (request, response) {
    var params = urlTool.parse(request.url, true)
    console.log(params)
    response.writeHead(200, {
      'Content-Type': 'text/plain'
    });
    if (params.query && params.query.callback) {

      // callback(data)
      var str = `${params.query.callback}(${JSON.stringify(data)})`
    }

    response.end(str);
}).listen(516);

console.log('Server running at http://127.0.0.1:516/');

执行代码
在这里插入图片描述

并且在node中显示

在这里插入图片描述

jsonp总结

  1. jsonp是一种跨域方案,他利用script标签没有跨域限制的特点,通过script标签的的src属性发送GET请求。
  2. 可以通过前后端约定一个字段名,比如callback,来传递一个函数名,从而使得前端可以使用对应的callback函数,拿到数据,处理数据。

jsonp和cors比较

JSONP只支持GET请求,CORS支持所有类型的HTTP请求。JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值