跨域解决方式——JSONP,CORS

tomcat下cors跨域解决架包 cors-filter-1.7.jar java-property-utils-1.9.jar 立即下载

1.同源策略于跨域

1.1 同源策略

首先我认为想要了解跨域前必须先要知道浏览器的同源策略。

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

同源指的是协议、域名、端口相同。

同源策略是客户端脚本(尤其是Javascript)的重要的安全度量标准,其目的是防止某个文档或脚本从多个不同 源装载。

其实在13年之前,在还没有提出前后端分离时。大多项目都是同源的,因为项目的前端页面不是复杂,通常直接将前端页面放在服务器上,直接进行服务器渲染。用户直接请求到html页面。

但是随着时间的推移前端界面变得越来越重要。如果将所以的前端界面放在服务器进行服务器端渲染,这无疑增加了服务器的压力。这时候就提出了前后端分离。所谓前后端分离就是前端有自己的web服务器,后端只提供数据,web服务器在另一边进行请求。这样就产生了一个问题。跨域

1.2 跨域

经过上面的描述,或许你已经基本清楚了跨域时怎么回事。

首先跨域是浏览器为了防止出现安全问题的一种机制

我们来看一下跨域的具体表现:

  1. 协议不同,如http, https
  2. 端口不同
  3. 主域相同,子域不同;
  4. 主域不同;
  5. IP地址和域名之间也算是跨域,浏览器不会自动做IP域名的映射

来看一个典型的跨域的例子:
现在我的服务器端口号是8000,web服务器的端口是5050。在web页面直接进行Ajax请求。会出现以下的错误内容:

在这里插入图片描述

读一下报错信息大概的意思就是http请求无法将端口为8000的服务器的数据读到5500端口的web界面。

1.3 为什么要设定跨域这个概念

上面也说到跨域是浏览器设定的一种机制。

细心的同学可能已经出现跨域情况时浏览器给我们的状态还是200。这就足以说明跨域是浏览器的机制,只是数据被拦截。请求时成功的。

在这里插入图片描述

那么到底到底为什么会有跨域呢?看一下几个场景:

1.用户登录了自己的aaa页面 http://aaa.com,http://aaa.com向用户的cookie中添加用户标识。

2.用户浏览了恶意页面 http://bbb.com。执行了页面中的恶意AJAX请求代码。

3.http://bbb.com向http://aaa.com发起AJAX HTTP请求,请求会默认把http://aaa.com对应cookie也同时发送 过去。

4.aaa页面从发送的cookie中提取用户标识,验证用户无误,response中返回请求数据。此时数据就泄露了。

5.而且由于Ajax在后台执行,用户无法感知这一过程。

2.解决跨域的方案

其实解决跨域的方式一共有7种,我这里一一列举出来

  1. jsonp
  2. cors
  3. 基于proxy(webpack-dev-server实现)
  4. postmessage
  5. socket.io
  6. iframe解决
  7. nginx反向代理

我们前端经常使用的其实前三种,jsonp其实相对于后两者有劣势。在实际开发种最最常用的还是cors和proxy。

但是本文介绍以下前两种(面试点)

2.1 jsonp

jsonp的原理其实有一点套娃的意思。使用回调函数"骗过"浏览器。

我们可以通过使用html的script标记来进行跨域请求,并在相应中返回要执行的script代码,其中可以直接使用JSON传递javascript对象。这种跨域的通讯方式成为JSONP。

因为script的src属性本身就是一个不会产生跨域的get请求。所以我们可以将回调函数写在URL中,然后再服务端处理传值,再再客户端设置一个全局的函数来执行回调函数。

下面我们来实现一个简单的jsonp案例:

客户端server.js:

const http = require('http');
const urly = require('url');
var obj={
    name:'jam',
    age:'12'
}
http.createServer((req,res) => {
    var parmer=urly.parse(req.url,true)

    console.log(parmer);
    //判断是否跨域(是否有parmer.query.callback这个值,如果有,拼接成带有参数的函数,传给客户端)
    if (parmer.query.callback) {
        var str=parmer.query.callback+'('+JSON.stringify(obj)+')'
        res.write(str);
    }else{
        res.write(JSON.stringify(obj));
    }
    res.end();
}).listen(8000,function () { 
    console.log('服务器开启');
 });

客户端client.js:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<script>
    //要执行的回调韩素华
    function hello(data) {
        console.log(data);
    }
</script>
  //使用script标签进行get请求,后接要传给服务端的回调函数
<script src="http://127.0.0.1:8000/?callback=hello"></script>
<body>
</body>
</html>

我们经常使用的jQuery中进行Ajax请求时设置的dataType属性为jsonp其实也是使用的这个原理。

不足之处:

  1. 只能进行get请求,标签限定
  2. 需要定义全局函数

2.2 CORS

跨域资源共享

它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。 CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。 整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信 没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附 加的请求,但用户不会有感觉。 因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。

这种方式也是我们经常使用的,通常在后端进行设定CORS相关属性。前端直接请求即可。

下面我贴出在express框架中的使用方法。

手动:

app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*')
res.header('Access-Control-Allow-Headers', 'Authorization,X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method' )
res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PATCH, PUT, DELETE')
res.header('Allow', 'GET, POST, PATCH, OPTIONS, PUT, DELETE')
next();
});

使用cors包(封装):

npm install cors --save-dev

const cors = require('cors');
app.use(cors());

我们这里需要注意的是在设置Origin字段时可以有两种情况:*和一个域名

在使用*(接受所有域名)的时候浏览器为了安全考虑是不会发送Cookie值的,使用一个域名的时候是可以的。但是在实际开发中我们通常只需要使用一个域名就可以完成业务了。

2.3 CORS和jsonp的比较

  1. jsonp可以支持老式浏览器,但是处理get请求。
  2. CORS支持几乎所有方式,当时不支持IE10一下浏览器
  3. 综合下来CORS是要比jsonp强大的。

好了关于后面的方式proxy也是比较常见的,剩下的就用的不太多了。

关于proxy后面再去整理

Open3D 计算FPFH特征【2025最新版】 FPFH特征描述子的python实现,本文最新更新时间为:2025年3月18日。 阅读详情

相关推荐

【搭建实战】全国天气预报看板搭建

不仅如此,码匠还一站式提供了企业内部系统常用的租户管理、细粒度的权限控制、审计日志等功能,让您快速搭建后台应用的同时,也为您的企业信息安全保驾护航。是一款国内研发的开发者友好的低代码平台,您无需了解React/Vue等框架的开发、部署等各种细节,就可以快速打通前后端,连接RESTAPI、MySQL、MongoDB等多种数据源,然后通过一套开箱即用的组件,轻松搭建功能完善的数据看板、数据洞察、Admin管理后台等多种应用。天气预报对我们的各项活动有很大的帮助,可以让我们合理安排自己的出行等活动。...

weixin_39545889的博客 427

Jsonp&Cors跨域(同源策略、跨域、劫持漏洞)

CORS)跨域资源共享,其思想是使用自定义的HTTP头部字段让浏览 器与服务器进行沟通,它允许浏览器向跨域服务器发出XMLHttpRequest请求,从而克服AJAX只能同源 使用的限制。CORS的基本原理是当浏览器在进行跨域请求时,会在请求中添加头部origin来表明自己的协议、主 机、端口号,当服务器接到请求并且看到这个origin头部时,如果设置过允许此域名进行访问,就得添 加头部Access-Control-Allow-Origin。

精品博客,你值得一看~ 1280

AD服务器搭建

一、角色安装1)打开服务器管理器,添加 角色和功能;2) 点 下一步;3)点 下一步;4)点 下一步;5)点击安装;6-1)将此服务器提升为域控制器;6-2)点下一步;6)输入密码 点 下一步;7)自动生成LIXF,点击下一步;8)确认目录,点下一步;8)确认安装条件,点安装; 8)安装成功,点关闭;...

潇峰的博客 6445

JSONP和CORS跨域

JSONP) 是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。CORS(跨域资源共享) 由一系列 HTTP 响应头组成,这些 HTTP 响应头决定浏览器 是否阻止前端JS代码跨域获取资源浏览器的同源安全策略默认会阻止网页“跨域”获取资源。但如果接口服务器配置了CORS相关的 HTTP 响应头,就可以解除浏览器端的跨域访问限制。

qq_25775675的博客 1323

10、利用智能合约实现公平的私有集合交集

本文探讨了利用智能合约实现公平的私有集合交集(PSI)的多种协议,重点分析了协议 Π 和 Π∗ 的气体成本与性能特点。同时对比了包括 Justitia 和 Anesidora 在内的现有方案,突出了仅使用智能合约实现硬币补偿公平性的优势。文中还介绍了相关密码学基础、安全模型及隐私保障机制,为在不同应用场景下选择高效、安全的 PSI 协议提供了理论支持和实践指导。

linux的博客 95

零件边界线提取处理原理详解

该程序提出了一种高效的点云边界提取方法,通过三阶段处理流程实现零件几何特征的精确提取。首先采用RANSAC算法进行坐标系标准化,包括主平面检测、点云分割和双重旋转对齐。接着使用凹包算法和RANSAC直线拟合提取底面边界。最后通过多方向密度切片分析(Z向100片、X向50片),自动选择高密度切片进行边界提取和直线拟合。算法具有鲁棒性强、处理效率高(支持OpenMP并行计算)和参数可配置等特点,能有效提取零件的几何边界特征,为后续质量检测提供基础。实验结果显示该方法能准确提取零件的多方向边界线。

weixin_45196569的博客 432

cors包如何解决跨域,用代码写出详细步骤

a. 安装npm i cors b. const cors = require("cors") c. app.use(cors())

Coder_Xy的博客 422

YOLO系列算法改进 | 自研篇 | C3k2融合Circulant Attention注意力模块 | 给局部特征提取器装上了全局动态卷积核,兼顾效率、精度与泛化能力!| AAAI 2026

YOLO系列算法改进 | 自研篇 | C3k2融合Circulant Attention注意力模块 | 给局部特征提取器装上了全局动态卷积核,兼顾效率、精度与泛化能力!| AAAI 2026 (以YOLO26最新目标检测模型为基础,融合C3k2_Circulant创新模块改进Backbone)

2502_91881744的博客 242

CORS跨域资源共享漏洞的复现、分析、利用及修复过程

CORS跨域资源共享漏洞与JSONP劫持漏洞类似,都是程序员在解决跨域问题中进行了错误的配置。攻击者可以利用Web应用对用户请求数据包的Origin头校验不严格,诱骗受害者访问攻击者制作好的恶意网站,

Innocence_0的博客 4000

桌面运维工程师面试题详解(一)

桌面运维工程师面试题详解(一)

jks212454的博客 1425

基于知识图谱的智能工作流引擎

随着大数据和人工智能技术的快速发展,企业和组织对数据的依赖程度日益增加。为了更好地管理和利用这些数据,知识图谱逐渐成为一种重要的工具。知识图谱不仅能够以结构化的方式表示复杂的知识,而且能够通过推理和查询提供深层次的信息。然而,如何将知识图谱应用于实际业务场景中,尤其是如何构建智能工作流引擎,仍然是一个具有挑战性的问题。智能工作流引擎是一种能够自动化执行复杂业务流程的系统,它可以通过对业务规则和数据的分析,自动生成和优化工作流,从而提高工作效率和准确性。

AI天才研究院 1870

同源策略和跨域解决方案——JSONP、CORS、代理跨域(vue-cli脚手架搭建代理服务器)

在简单请求中,只要满足简单请求的要求,一般情况下,是不怎么需要服务端去进行配置的,除了Access-Control-Allow-Origin这个字段是必备的OPTIONS请求作为预检请求,就算请求方法没有在Access-Control-Allow-Methods规定范围内也不会出现错误,但是我们不能自己发送OPTIONS请求CORS跨域设置涉及到后端和前端的配合。后端通过设置响应头来允许特定的跨域请求,而前端则需要确保请求头中包含适当的信息。这样可以保障安全地进行跨域资源访问参考文档:MDN。

m0_55734628的博客 3520

Codex 实战 Skills:如何用 Skill 让 AI 模拟人工点击,自动完成复杂的前端表单测试

本文介绍如何构建基于Selenium WebDriver的AI Agent技能,实现自动化UI测试流程。主要内容包括: 环境搭建:配置无头Chrome浏览器环境,使用WebDriver Manager自动管理驱动 核心技能开发:通过ID、CSS Selector、XPath等策略定位元素,实现显式等待机制 交互模拟:使用ActionChains模拟鼠标悬停等复杂操作 稳定性优化:解决异步加载问题,确保测试可靠性 Skill封装:将功能模块化,使AI能通过自然语言指令操作Web界面 该方案突破了传统自动化测试

yueyeguzhuo的专栏 147

前端跨域三种解决方式(CORS、JSONP、代理跨域)

什么是跨域? 跨域是浏览器为了安全而作出的限制策略(所以服务端不涉及到跨域); 浏览器请求必须遵循同源策略,即同域名、同端口、同协议; 例如: http://www.abc.com到http://www.def.com的请求会出现跨域(域名不同) http://www.abc.com:3000到http://www.abc.com:3001的请求会出现跨域(端口不同) http://www.abc.com到https://www.abc.com的请求会出现跨域(协议不同) 解决方法: 1. ..

卡卡西:一个擅长拷贝的前端程序员 2万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Ajax编程之使用JSONP和CORS跨域资源共享方式解决同源限制问题

Ajax编程之使用JSONP和CORS跨域资源共享方式解决同源限制问题

qq_43537721的博客 384

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

解决跨域的方式jsonp和cors

JSONP方式 1.由于XMLHttpRequest不支持不同源地址之间发送异步请求, 2.借助script标签可以发送不同源地址之间请求的特性,去完成的跨域请求; 3.只能发送get请求;???jQuery封装的可以吧? 4.原生方式封装的JSONP,jQuery封装的jsonp jQuery封装的jsonp $.ajax({ url:'', dataType:'JSONP',//只需要把a...

张志勇的博客 591

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

解决跨域--jsonp、nginx、cors三种方式

from:http://blog.abreaking.com/c/jjkyjncszfs 一、什么是跨域 如果存在协议、域名、端口或者子域名不同服务端,都会算作跨域。一般来讲,浏览器为了安全的问题都是限制了跨域的访问,因而,有时候就需要想方法绕过浏览器的同源策略了。 二、使用jsonp解决的跨域问题    根据jquery的文档:jsonp是json的一种扩展,它要求服务端的代码来检测并处...

xixihahahehegaga的博客 968

JSONP和CORS两种跨域方式的简单介绍和解决方案实例

JSONP和CORS两种跨域方式的简单介绍和解决方案实例

wangchaoqi1985的博客 151

在Vue中解决跨域问题可以通过以下几种方式:使用JSONP、CORS、代理服务器

JSONP(JSON with Padding):JSONP是一种利用标签没有跨域限制的特性来获取数据的方法。在使用JSONP时,前端会动态创建一个标签,将请求发送到目标服务器上,并指定一个回调函数作为参数。目标服务器在返回数据时,将数据包装在回调函数中,以JavaScript代码的形式返回给前端。由于标签没有同源策略限制,因此可以获取到返回的数据。

m0_71966801的博客 5770

Web跨域问题和常用解决方式cors和jsonp以及反向代理

Web跨域问题和常用解决方式cors和jsonp以及反向代理

质量不太好的博客 4573

跨域访问的两种解决方式:jsonp和cors

JSONP jsonp详解的参考网页 JSONP的最基本的原理是:动态添加一个$.ajax({ url : "test!test.action", type : "GET", data : ({}), dataType : "jsonp", jsonp: 'jsonpcallback', ...... });服务端代码 返回的格式为:js

small_k的专栏 651

ajax原理以及六大解决跨域的方法

JSONP的原理:通过script标签的异步加载来实现的。比如说,实际开发中,我们发现,head标签里,可以通过script标签的src,它是没有同源限制的,里面放url,加载很多在线的插件。5、nginx反向代理(前端开发的时候本地通过vue.config.js中的proxy代理的方式,需要部署到线上的时候,让后端配置nginx,对匹配到的接口进行代理转发)其实很多跨域原理,都是根据 ,服务器和服务器之间并没有跨域的概念的,因为跨域也是浏览器行为,所以就通过 一般通过 ‘跨过’浏览器的方式。

2401_89760128的博客 721

解决跨域的方案:JSONP,cors方式 ,vue-cli反向代理(最常用的方法)

Vue.config.js的配置(配置反向代理)----在module.exports中。

idiot_MAN的博客 486

跨域的五种解决方案详解

CORS :全称cross origin resource share (资源共享) 工作原理: 服务器 在返回响应报文的时候,在响应头中 设置一个允许的header

weixin_64214997的博客 2万+

【转载】ajax跨域及解决方案(jsonp、cors)

题纲关于跨域,有N种类型,本文只专注于ajax请求跨域(,ajax跨域只是属于浏览器"同源策略"中的一部分,其它的还有Cookie跨域iframe跨域,LocalStorage跨域等这里不做介绍),内容大概如下:什么是ajax跨域原理表现(整理了一些遇到的问题以及解决方案)如何解决ajax跨域JSONP方式CORS方式代理请求方式如何分析ajax跨域http抓包的分析一些示例什么是ajax跨域。

2401_84091938的博客 1352
上一篇: nodejs连接mysql的坑:“Access denied for user ‘root‘@‘localhost‘ (using password: YES)“
下一篇: gulp自动化构建项目
小牲口online
博客等级 码龄8年 116粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值