一、同源策略(Same-Origin Policy),是浏览器的一种安全策略.

1、同源(即url相同):协议、域名、端口号 必须完全相同。(请求是来自同一个服务)

2、跨域:违背了同源策略,即跨域。

3、ajax请求是遵循同源策略的。

■ 同源请求例子(在浏览器访问127.0.0.1:9000/server-orign,然后点击按钮发送同源请求):

  • 服务端对同源请求处理:

    //3、创建路由规则(request 是请求的报文,response是响应的报文)
    app.get('/server-orign', (request, response) => {
    //响应一个页面
    response.sendFile(__dirname + '/同源策略.html');
    });
    app.get('/data', (request, response) => {
    //响应数据
    response.send('服务端返回的数据');
    });
  • 客户端html:

        const btn = document.getElementsByTagName('button')[0];
    btn.onclick = function () {
    //console.log('测试');
    //发送ajax请求
    const xhr = new XMLHttpRequest();
    xhr.open('GET', '/data');//同源请求,路径可以简写
    xhr.send();
    xhr.onreadystatechange = function () {
    if(xhr.readyState === 4){
    if(xhr.status >= 200 && xhr.status < 300){
    console.log(xhr.response);
    }
    }
    }
    }

二、解决跨域(JSONP、CORS)

1、非官方解决途径JSONP:

(1) JSONP 是什么?

JSONP(JSON with Padding),是一个非官方的跨域解决方案,只支持 get 请求

(2) JSONP 怎么工作的?

在网页有一些标签天生具有跨域能力,比如:img link iframe script。 JSONP 就是利用 script 标签

利用script的路径src作为请求路径,然后只需要服务端返回的数据封装成js代码即可

■ jsonp例子1:

  • 服务端处理,响应返回js代码(跟咱平时引入外部的js代码一样啦):
app.get('/jsonp', (request, response) => {
//响应数据
response.send('console.log("hello jsonp")');
});
  • 客户端处理:
<script src="http://127.0.0.1:9000/jsonp"></script>

■ jsonp例子2(验证用户名,显示密码):

  • 服务端处理:

    //服务端验证用户名
    app.all('/check', (request, response) => {
    //响应数据
    // response.send('console.log("hello jsonp")');
    const data = {
    name:'admin',
    password:'123456'
    };
    let str = JSON.stringify(data);
    response.end(`handle(${str})`);//调用客户端(前端)的handle方法
    });
  • 客户端处理:

      用户名: <input type="text" name="name"/>
    <p></p> <script>
    const input = document.getElementsByTagName('input')[0];
    const p = document.querySelector('p'); //声明一个handle函数,用来给服务端调用,以处理服务端返回的数据
    function handle(data) {
    input.style.border = "solid 1px #f00";
    let username = input.value;
    //若用户名正确,将服务端返回的数据显示到p标签内
    if(username === data.name){
    p.innerHTML = data.password;
    }
    } input.onblur = function () {
    //向服务端发送请求(jsonp),检查用户是否存在
    const script = document.createElement('script');
    //设置script标签的src为ajax的url
    script.src = 'http://127.0.0.1:9000/check';
    //在界面生成dom元素
    document.body.appendChild(script);
    }
    </script>

❀ jsop跨域访问第三方接口,请求成功,但是却拿不到数据?

从上面的例子可以看到当服务端是第三方(例如访问百度的快递接口:https://express.baidu.com/express/api/express),

通过jsonp跨域方式去访问第三方接口,结果:请求成功,状态码是200,但是无法拿到响应的数据

( 原因1:第三方服务在创建路由规则时,设置不允许跨域访问,所以提示CORB,无法直接拿到数据;

原因2:想通过script标签的 src='请求url' 引入服务端响应回来的js代码,但是且不知道第三方服务端响应时是怎么书写的,不知道回调了什么函数

总结:jsonp 解决跨域访问,除了类型是GET,还需要服务器的配合才能完成跨域

□ 咱自己的服务端没设置允许跨域访问,默认为不允许跨域访问

□ 但是咱设置了在服务端设置请求时响应回去一些js代码(handle函数的调用(data的json对象作为参数)的js代码

□ 在客户端咱通过 src='请求url' 引入服务端响应回来的js代码,而咱知道咱服务端响应回来一个handle函数的调用,所以咱在客户端定义了一个handle回调函数(handle函数的参数是响应回来的json格式的数据)。


2、官方解决途径CORS:

(1)CORS: Cross-Origin Resource Sharing 跨域资源共享, 即服务端设置响应头是允许跨域的

(2)CORS的更多介绍:跨源资源共享(CORS) - HTTP | MDN (mozilla.org)

  • 服务端cors跨域请求处理:

    app.all('/cors', (request, response) => {
    //设置响应头(允许跨域)
    response.setHeader('Access-Control-Allow-Origin', '*');
    // response.setHeader('Access-Control-Allow-Origin', 'http://127.0.0.1:9000); //设置响应头(允许自定义请求头)
    response.setHeader('Access-Control-Allow-Headers', '*');
    //设置响应头(允许自定义请求方式)
    response.setHeader('Access-Control-Allow-Method', '*'); //设置响应体
    response.send('hello cors');
    });
  • 客户端处理:

    <button>点击发送ajax请求</button>
    
    <script>
    const btn = document.getElementsByTagName('button')[0];
    btn.onclick = function () {
    const xhr = new XMLHttpRequest();
    xhr.open('get', 'http://127.0.0.1:9000/cors');
    xhr.send();
    xhr.onreadystatechange = function () {
    if(xhr.readyState === 4){
    if(xhr.status >= 200 && xhr.status < 300){
    console.log(xhr.response);
    }
    }
    }
    }
    </script>

学习AJAX必知必会(4)~同源策略、解决跨域问题(JSONP、CORS)的更多相关文章

  1. 浏览器同源策略,跨域请求jsonp

    浏览器的同源策略 浏览器安全的基石是"同源政策"(same-origin policy) 含义: 1995年,同源政策由 Netscape 公司引入浏览器.目前,所有浏览器都实行这 ...

  2. 第二百七十四节,同源策略和跨域Ajax

    同源策略和跨域Ajax 什么是同源策略  尽管浏览器的安全措施多种多样,但是要想黑掉一个Web应用,只要在浏览器的多种安全措施中找到某种措施的一个漏洞或者绕过一种安全措施的方法即可.浏览器的各种保安措 ...

  3. JS同源策略和跨域问题

    同源策略和跨域问题:http://www.cnblogs.com/chaoyuehedy/p/5556557.html 深入浅出JSONP--解决ajax跨域问题:http://www.cnblogs ...

  4. 11. cookie_session_原生ajax_readyState的值_同源策略_跨域_jsonp的使用

    1. cookie 浏览器存储技术.(服务器将少量数据交于浏览器存储管理) 作用: 存储数据, 解决 http 协议无状态问题 工作流程: 浏览器发送请求给服务器,请求登录 服务器返回响应给浏览器,此 ...

  5. JS同源策略和跨域访问

    同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上的,浏览器只 ...

  6. Ajax_同源策略以及跨域问题

    Ajax_同源策略 同源策略是浏览器的一种安全策略, 同源指的是:协议.域名.端口.必须完全相同. 违背同源策略就是跨域. 而AJAX是默认遵循同源策略的: 同源说通俗一点呢就是页面跟获取请求的接口是 ...

  7. cors跨域和jsonp劫持漏洞 和 同源策略和跨域请求解决方案

    cors跨域和jsonp劫持漏洞: https://www.toutiao.com/a6759064986984645127/ 同源策略和跨域请求解决方案:https://www.jianshu.co ...

  8. 同源、同源策略、跨域问题、django解决方案

    什么是同源: URL由协议.域名.端口和路径组成,如果两个URL的协议.域名和端口相同,则表示他们同源. 注意:假如你的网站ip是123.123.123.123,网站的域名是www.abc.com. ...

  9. XSS中的同源策略和跨域问题

    转自 https://www.cnblogs.com/chaoyuehedy/p/5556557.html 1 同源策略 所谓同源策略,指的是浏览器对不同源的脚本或者文本的访问方式进行的限制.比如源a ...

  10. 同源策略、跨域、json和jsonp

    同源策略 源(origin)就是协议.域名和端口号.若地址里面的协议.域名和端口号均相同则属于同源. 以下是相对于 http://www.a.com/test/index.html 的同源检测 • h ...

随机推荐

  1. 200行代码理解Asp.Net Core

    转自https://www.cnblogs.com/xiandnc/p/11480735.html

  2. IDE Goland DEBUG报错(could not launch process: decoding dwarf section info at offset 0x0: too short)

    背景: 在升级GO版本到1.11后发现Goland的Debug报错,如下:could not launch process: decoding dwarf section info at offset ...

  3. 【LeetCode】141. Linked List Cycle 解题报告(Java & Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双指针 保存已经走过的路径 日期 [LeetCode ...

  4. Ubuntu 16.04远程配置Jupyter Notebook

    安装和配置Jupyter Notebook 安装jupyter notebook conda conda install -c conda-forge notebook pip pip install ...

  5. JDK、JVM和JRE三者间的关系,及JDK安装路径下的文件夹说明

    JDK的全称是Java SE Development Kit, 即Java标准开发包,是Sun公司提供的一套用于开发Java应用程序的开发包, 它提供了编译.运行Java查询所需的各种工具和资源,包括 ...

  6. MySQL数据操作与查询笔记 • 【第7章 连接查询】

    全部章节   >>>> 本章目录 7.1 内连接查询 7.1.1 交叉连接(笛卡尔积) 7.1.2 内连接查询概要 7.1.3 内连接案例 7.1.4 自然连接 7.2 多表连 ...

  7. MySQL数据操作与查询笔记 • 【第5章 MySQL 函数】

    全部章节   >>>> 本章目录 5.1 数学函数和控制流函数 5.1.1 数学函数 5.1.2 控制流函数 5.2 字符串函数 5.2.1 字符串函数介绍 5.2.2 字符串 ...

  8. Java链式调用

    疯狂的类构造器Builder模式,链式调用 以swagger配置类为例 比如需要返回一个ApiInfo 的类,可以直接new一个ApiInfo,这样一般需要把参数都填上 或者,可以使用他的builde ...

  9. SSH公/私秘钥的生成及使用

    如果使用GitHub比较多的朋友,对SSH Key肯定也不陌生,当我们SSH进行代码的pull&push时,往往需要我们配置SSH Key. 如果Linux用的多朋友,肯定对SSH Key都很 ...

  10. Sentry 企业级数据安全解决方案 - Relay 运行模式

    内容整理自官方开发文档 Relay 可以在几种主要模式之一下运行,如果您正在配置 Relay server 而不是使用默认设置,那么事先了解这些模式至关重要. 模式存储在配置文件中,该文件包含 rel ...