跨域ajax原理,跨域 ajax 请求之 cors 原理解析

2023-11-02

9ac5e4e30859fb63569e5fad0d8d2230.png本博客不欢迎:各种镜像采集行为,请尊重知识产权法律法规。大家都是程序员,不要闹得不开心。

本文是系列文章,上一篇文章地址是:https://newsn.net/say/cross-domain-ajax-jsonp.html 。本文主要说两个高级点的跨域话题,即:接口cookie传递及不使用jsonp如何设置跨域。

027da9c3094e01e16b420e23ab64f62a.png跨域 ajax 请求之 cors 原理解析(图1-1)

原理描述

目前的最新浏览器下面,都可以不使用jsonp来跨域了,就是说还使用传统的json。当然了,前端请求的时候,要特殊写上点代码,后端处理的时候,也需要发出特殊的header头,整个过程才能畅通。

另外,默认情况下,跨域的话,是不会发送cookie的。而服务器端接口需要做权限判断之类的话,就需要cookie上的支持。这个时候,同样需要做些设置。

前端代码

好了,先整体的来说。下面是前端相关代码,以jquery为例:$.ajaxSetup({

crossDomain: true,

xhrFields: {

withCredentials: true

}

});

这个非常简单,设置上这个之后,页面上所有的ajax请求都不用特殊写代码了,都会默认支持跨域传递cookie。是不是很简单?

如果你不这么整体的来写的话,每个ajax请求都需要额外添加crossDomain和xhrFields这2个属性。貌似真心不是很方便。$.ajax({

url:'https://newsn.net/',

type:'GET',

dataType:'json',

success:function (data) {},

crossDomain: true,

xhrFields: {

withCredentials: true

}

});

后端代码

后端服务器端,需要发送这些header头到客户端,苏南大叔下面的demo是php版本的。Access-Control-Allow-Credentials:true

Access-Control-Allow-Headers:*

Access-Control-Allow-Methods:GET,POST,OPTIONS

Access-Control-Allow-Origin:*

Access-Control-Max-Age:864000

这里要特别强调的是:Access-Control-Allow-Origin这个属性,设置为*肯定可以。不过,这就非常不安全了,因为这个就是来控制到底哪个域名可以跨域访问接口的。所以,这个属性,一定要设置为具体的网址才好,注意要设置为 https://yourdomain.com:port 类似这样的,http和https一定要区分好,端口号如果有的话,也一定要带上。当然了,这些header是php发出的,还是nginx发出的,都是可以的。

nginx代替php发出特定header

可能,nginx发出header似乎更合适一些。那么下面贴出的就是可能的nginx设置。

参考文章:https://enable-cors.org/server_nginx.htmllocation / {

if ($request_method = 'OPTIONS') {

add_header 'Access-Control-Allow-Origin' '*';

#

# Om nom nom cookies

#

add_header 'Access-Control-Allow-Credentials' 'true';

add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

#

# Custom headers and headers various browsers **should** be OK with but aren't

#

add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';

#

# Tell client that this pre-flight info is valid for 20 days

#

add_header 'Access-Control-Max-Age' 1728000;

add_header 'Content-Type' 'text/plain charset=UTF-8';

add_header 'Content-Length' 0;

return 204;

}

if ($request_method = 'POST') {

add_header 'Access-Control-Allow-Origin' '*';

add_header 'Access-Control-Allow-Credentials' 'true';

add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';

}

if ($request_method = 'GET') {

add_header 'Access-Control-Allow-Origin' '*';

add_header 'Access-Control-Allow-Credentials' 'true';

add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';

}

}

下面的是另外一个我使用过的配置:server {

listen 443 ssl;

server_name blogd.newsn.net;

ssl_certificate /application/nginx/ssl/newsn.net.crt;

ssl_certificate_key /application/nginx/ssl/newsn.net.key;

ssl_session_timeout 5m;

ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;

ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5;

ssl_prefer_server_ciphers on;

access_log /data/logs/nginx/cloud/access.log json;

error_log /data/logs/nginx/cloud/error.log error;

set $ACAO 'http://blog.newsn.net https://blog.newsn.net';

if ($http_origin ~* ^(http|https)://blog\.newsn\.net$) {

set $ACAO $http_origin;

}

add_header Access-Control-Max-Age 864000;

add_header Access-Control-Allow-Credentials true;

add_header Access-Control-Allow-Origin '$ACAO';

add_header Access-Control-Allow-Headers X-Requested-With;

add_header Access-Control-Allow-Methods GET,POST,OPTIONS;

location /robots.txt {

root html;

}

location / {

if ($request_method = 'OPTIONS') {

add_header Access-Control-Max-Age 864000;

add_header Access-Control-Allow-Credentials true;

add_header Access-Control-Allow-Origin '$ACAO';

add_header Access-Control-Allow-Headers X-Requested-With;

add_header Access-Control-Allow-Methods GET,POST,OPTIONS;

return 204;

}

proxy_pass http://blog-portal;

proxy_http_version 1.1;

proxy_set_header Connection "";

#proxy_set_header Host $host:$server_port;

proxy_set_header Host $host;

#proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

#proxy_set_header X-Forwarded-Proto $scheme;

}

}

server {

listen 80;

server_name blog.newsn.net;

rewrite ^(.*) https://blog.newsn.net$1 permanent;

}

结语

苏南大叔觉得,鉴于nginx设置如此繁杂,我们还是老老实实的用php输出header吧,其实蛮简单的。是不是?据说,上述设置中的js部分在ie低版本浏览器下面是不ok的。那么如果我们需要兼容ie低版本的话,那么还是老老实实的写不安全的jsonp,似乎是更好的解决方案。

93ddba5b688a6967c0a88c0220992c34.png

e6eebe3032abd035b5cf072fe954fec6.png 如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。

9ac5e4e30859fb63569e5fad0d8d2230.png 本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

跨域ajax原理,跨域 ajax 请求之 cors 原理解析 的相关文章

  • 机器学习——为什么逻辑斯特回归(logistic regression)是线性模型

    问 逻辑斯蒂回归是一种典型的线性回归模型 答 正确 逻辑斯蒂回归是一种典型的线性回归模型 它通过将线性回归模型的输出结果映射到 0 1 区间内 表示某个事物发生的概率 从而适用于二分类问题 具体地说 它使用sigmoid函数对线性回归模型的
  • Python的赋值与深浅拷贝

    简要版本 由于 Python 内部引用计数的特性 对于不可变对象 浅拷贝和深拷贝的作用是一致的 就相当于复制了一份副本 原对象内部的不可变对象的改变 不会影响到复制对象 浅拷贝的拷贝 其实是拷贝了原始元素的引用 内存地址 所以当拷贝可变对象
  • FLEX开发人员中心部分下载

    Adobe Application Modeling plug in download Adobe Application Modeling plug in download 点击进入 Flex MX Skin Design Extensi
  • C语言基础入门48篇_47_C语言操作文件(文件操作函数、打开文件fopen()、关闭文件fclose()、fclose规范程序、野指针的定义为:指针地址存在,但是指针指向的是一个已经释放的资源)

    本篇主要介绍c语言中对文件的打开关闭操作 1 C语言文件操作函数 C标准库中提供了一系列的函数 来操作文件 因为C库函数做了这个中间层 屏蔽掉了操作系统上对于文件的不同处理 关于文件的常见基本操作有 打开文件fopen 创建文件或打开文件载
  • 2020-6次面试阿里,持续一个多月,终于拿到offer了!

    从3月开始准备 一直到5月22号 终于拿到阿里的实习offer 这一路 真的是一把辛酸泪 下面细说之 在这一路上 坎坎坷坷 跌跌宕宕 期间 面了阿里 腾讯 百度 今日头条 小米 笔试网易 美团 携程 爱奇艺 不得不说 阿里是持续周期最长的
  • 视频爬虫逆向简单入门级

    严禁用于学习交流之外的任何用途 侵删 只能说这个比较简单 没什么难度 很适合做js逆向入门 下面就开始解析一下这个网站吧 aHR0cHM6Ly93d3cubWlndXZpZGVvLmNvbS9tZ3Mvd2Vic2l0ZS9wcmQvZGV
  • python中的爬虫基础工具介绍

    一 引入什么是爬虫 网络爬虫 按照一定的规则 自动地抓取互联网信息的程序 通俗的来讲 模拟用户端向服务器发送请求 批量获取数据的一种程序或 工具 方式 二 爬虫的分类 1通用爬虫 通用网络爬虫是捜索引擎抓取系统 Baidu Google S
  • 二进制部署k8s集群

    二进制部署k8s集群 1 安装要求 在开始之前 部署 Kubernetes 集群机器需要满足以下几个条件 一台或多台机器 操作系统 CentOS7 硬件配置 2GB 或更多 RAM 2 个 CPU 或更多 CPU 硬盘 30GB 或更多 集
  • 【JavaSE】常用类库1

    常用类库 1 对象清理 对象的清理 JDK1 9以前 使用Object中的finalize 方法 JDK1 9后 java lang ref Cleaner类 基于AutoCloseable接口资源释放 对象释放前 启动对象清理线程 pub
  • 20220128学习记录- 北交opencv基础

    1 模拟图像 空间采样与亮度量化 数字图像 空间分辨率 与采样间隔有关 亮度分辨率 与灰度级有关 2 图像存储 比特数 面积x灰度级的量化级别 注意是256灰度级不是乘256而是乘8 2的8次方 3 各类图像格式的特点与区别 4 灰度直方图
  • 什么是数据挖掘技术,基本概念是什么?

    随着计算机技术的发展 各行各业都开始采用计算机及相应的信息技术进行管理和运营 这使得企业生成 收集 存贮和处理数据的能力大大提高 数据量与日俱增 企业数据实际上是企业的经验积累 当其积累到一定程度时 必然会反映出规律性的东西 对企业来 堆积
  • JavaWeb-使用cookie完成两周内免登录功能

    欢迎页面 h2 欢迎页面 h2 br
  • 一文看懂异步 FIFO 架构(三) 双时钟的异步 FIFO

    目录 工作原理 方向标志 方向标志的实现 计算满和空 结论 往期系列博客 在本系列的第一篇文章中 我们看到了 FIFO 的一般架构 并分析了一个时钟的简单情况 该系列的第二部分描述了一种可能的双时钟设计的架构 在第三部分中 我们将探索另一种
  • Window操作系统基本知识

    windows系统 kernel32 dll是Windows 系统中非常重要的32位动态链接库文件 属于内核级文件 它控制着系统的内存管理 数据的输入输出操作和中断处理 当Windows启动时 kernel32 dll就驻留在内存中特定的写
  • 【CSS】滚动条样式详解

    只总结webkit的 IE与firefox暂不做记录 呼出与关闭滚动条 1 如果是浏览器的滚动条 其依赖的是html标签 我们不需要设置 内容溢出会自动出现 对html标签的溢出样式隐藏即可 html overflow x hidden 隐
  • 集合竞价规则及集合竞价的产生条件

    了解一下集合竞价规则 对于股民来说 是非常重要的 否则连一些基本的定义都了解不清楚的话 那么就麻烦了 下面为你介绍一下集合竞价规则以及集合竞价的产生条件 如果想要了解更多集合竞价方面的知识 敬请关注QR量化投资社区 下面让我们了解一下集合竞
  • 引入flutter module,运行时flutter_webview_plugin报错:Unhandled Exception: MissingPluginException

    异常信息 Android原生项目引入了一个flutter module flutter module用到了一个flutter写的sdk sdk需要使用webview来执行js代码 因此sdk引用了flutter webview plugin
  • mysql 分区表合并_MySQL 合并表、分区表

    合并表 合并表示一种早期的 简单的分区实现 在未来可能被淘汰 不推荐使用 限制 合并表和子表的字段 索引要完全相同 即使子表上有主键限制 合并表中仍然会出现重复值 如果删除其中一个子表 表可能还存在 带只能通过合并表访问 视操作系统而定 合
  • @GetMapping 接多个参数的写法

    后面拼接接着拼接上去就行了 此上方面针对于 接收多个未知参数 但是针对有很多需要模糊查询的方面 如果 我们所需要的接收的参数 是我们实体类对象的话 就不需要这么麻烦了 直接带入实体类对象 用即可

随机推荐

  • qt 串口通信

    qt串口通信 需要用到QSerialport类 1 pro文件中添加QT serialport 2 获取当前有哪些串口设备 QSerialPortInfo availablePorts 3 设置要打开的串口 setPortName 然后打开
  • 前端人员学习postman

    前端人员使用postman postman介绍 下载安装 posman的基本操作 主要进的是如何新建一个文件夹 然后新建请求 postman发送不同请求 讲的是如何发送不同类型的请求 发送get请求 发送post请求 body里面数据类型的
  • 人工智能科技成熟的11个Github上免费开源项目,很多电影中才有的场景应用到现实颠覆普通人的认知和想象

    人工智能科技成熟的11个Github上免费开源项目 很多电影中才有的场景应用到现实颠覆普通人的认知和想象 全文大纲 PULSE 该开源项目可以通过给图片增加像素点来实现去马赛克或高清化 Depix 给打了马赛克的文字去码 TecoGAN 给
  • Wireshark数据抓包分析之ARP协议

    目录 预备知识 1 知识储备 2 什么是ARP 3 ARP工作流程 4 ARP缓存表 实验目的 实验环境 实验步骤一 实验步骤二 实验步骤三 预备知识 1 知识储备 推荐两本好书 TCP IP详解卷1 http www pc6 com so
  • 两相混合步进电机(简单驱动器)simulink仿真

    1 目的 主要是控制步进电机的正反转以及周期性的转动一个步距角度 驱动模式为整步4拍不涉及到对转速的控制 比较基础 其次比较着重于对模型的分析 如有错误 这里欢迎大佬们指出 推荐先看一下以下的论文 基于simulink的步进电机控制系统仿真
  • MySQL 删除表中的数据记录

    文章目录 前言 一 删除表中的数据记录 1 删除特定数据记录 2 删除所有数据记录 总结 前言 删除数据记录是数据操作中常见的操作 可以删除表中已经存在的数据记录 在MySQL中可以通过DELETE语句来删除数据记录 该SQL语句可以通过以
  • JAVA中extends 与implements区别

    http www cnblogs com hnrainll archive 2011 10 11 2207773 html JAVA中extends 与implements有啥区别 1 在类的声明中 通过关键字extends来创建一个类的子
  • 爬取豆瓣电影排行榜top 250

    coding utf 8 import requests import re os 爬取豆瓣250 def douban ranking start 构建请求 param start start filter respon requests
  • 使用VS Code断点调试PHP

    vs code 使用一款杰出的轻量级代码编辑器 其中的插件工具不胜枚举而且还在不断增加 使用 vs code 调试 php 代码更是方便简洁 下面我们来一起看一下 1 安装 XDebug 扩展 调试 php 代码最常用的就是 XDebug
  • python:ezdxf——如何使用

    官方文档 https ezdxf readthedocs io en master howto index html 文章目录 一 基本文件 1 设置 获取标头变量 2 设置DXF绘图单元 3 创建更具可读性的DXF文件 DXF漂亮打印机
  • 下载vant源码在本地查看小程序模版

    官网地址 Vant地址 运行 git clone git github com youzan vant weapp git cd vant weapp npm install npm run dev 接着打开微信开发者工具 导入exampl
  • Rethinking BiSeNet For Real-time Semantic Segmentation

    Rethinking BiSeNet For Real time Semantic Segmentation 摘要 BiSeNet已经被证明是一种流行的实时分割的双流网络 然而 其增加额外路径来编码空间信息的原理是耗时的 并且从预训练的任务
  • OSS操作示例

    一 OSS API文档 https www alibabacloud com help zh doc detail 103185 htm spm a2c63 l28256 b99 879 7d315cc5HEvVNn 二 demo ifnd
  • Linux调试工具

    addr2line translates addresses into file names and line numbers Given an address in an executable or an offset in a sect
  • JDBC原始版本,未封装

    JDBC原始版本 未封装 public static void main String args Connection connection null PreparedStatement preparedStatement null Res
  • fastadmin 部署模板变量

    对于 view 内的HTML 可以直接使用 this gt assign group chat id get group chat id
  • Check—强大的C语言单元测试框架

    1 前言 在看基数树源码时 发现源码里面有个deps的依赖文件夹 deps里是一个叫Check的源码安装包 Google之后发现Check原来是C语言单元测试框架 关于单元测试 Wikipedia的介绍点这里 Check 最主要的优点是对于
  • HR SaaS厂商,进入决赛圈

    在愈发需要降本增效的节点 数字化的价值也更在被越来越多的企业重新审视 这种重视不再是之前或有或无的可选项 而是基于真正人效比维度的必选项 作者 斗斗 编辑 皮爷 出品 产业家 SaaS行业 正在发生一些微妙的变化 以HR SaaS赛道为例
  • 红帽企业版linux 7.3,红帽推企业Linux 7.3 新功能特性一览

    原标题 红帽推企业Linux 7 3 新功能特性一览 IT168 云计算 日前红帽宣布推出企业Linux 7 3版本 作为Linux平台的最新版本 红帽方面透漏本次更新的版本在网络与存储功能两方面做到了强化 同时 该版本还引入了关于Linu
  • 跨域ajax原理,跨域 ajax 请求之 cors 原理解析

    本博客不欢迎 各种镜像采集行为 请尊重知识产权法律法规 大家都是程序员 不要闹得不开心 本文是系列文章 上一篇文章地址是 https newsn net say cross domain ajax jsonp html 本文主要说两个高级点