同源策略_如何支持跨域

欢迎大家阅读《朝夕Net社区技术专刊》

我们致力于.NetCore的推广和落地,为更好的帮助大家学习,方便分享干货,特创此刊!很高兴你能成为忠实读者,文末福利不要错过哦!

01

PART

CoreWebApi的调用

1.在Core MVC下建立WebApi—CrossDomainController控制器下的GetCrossDomainData api,如图1所示;启动后通过浏览器调用正常如图2;

图1

图2

2.那么试试Ajax调用试试呢?如图3,如果请求到,就把结果放到div 中去;那运行的时候,不仅没有获取到数据,而且还报错了如图4.

图3

图4

那么这里的问题就是浏览器的同源策略,引发的跨域问题;下面将把这个问题的根本缘由给大家做一下说明.

02

PART

浏览器同源策略

什么是同源策略?同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,请明确:他是浏览器的安全约定。所谓的同源,指的是协议,域名,端口相同。浏览器处于安全方面的考虑,只允许本域名下的接口交互,不同源的客户端脚本,在没有明确授权的情况下,不能读写对方的资源。

设想这样一种情况:A网站是一家银行,用户登录以后,又去浏览其他的网站,如果其他网站可以读取A网站的Cookie,会发生什么?很显然,如果Cookie包含隐私(比如存款总额),这些信息就会泄漏。更可怕的是Cookie往往用来保存用于的登录状态,如果用户没有退出登录,其他网站就可以冒充用户为所欲为,因为浏览器同时还规定,提交表单不受同源策略的限制。由此可见,同源策略是必须的。如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问;如图5。

图5

那么上面我们在调用的时候就是因为这个问题、Ajax的脚本,和Api非同源;Ajax请求Api的时候,违背了浏览器的这个约定,所以不能用;其实Ajax在请求的时候,是能够请求到Api的,Api也返回了数据;却因为浏览的同源要求,而报错了;下面给大家证明一下:运行Api:Api打断点:测试起来。。。如图6  、图7所示;

图6   

断点能进来

图7  

但是就是报错,浏览器限制了;不能用;

以上描述的就是浏览器的同源策略   在非同源的情况下使用脚本调用Api会报错的;这就是所谓的跨域问题。

03

PART

如何解决跨域问题?

首先来分析一下出这个问题的原因;是因为浏览器的约定而出现的;那么如果我不使用非同源的脚本来调用呢?是可以的;定义一个Api 模拟Http请求去请求这个非同源的Api;

第一步:定义定义Api 模拟http请求:

我这里是另外又建立了一个项目:模拟http请求;调用这个Api,让这个后台的Api再去调用非同源的Api-- GetCrossDomainData

第二步:运行起来:

包括运行GetCrossDomainDataApi所在的项目;命令启动:dotnet Zhaoxi.Core.WebApi.dll --urls="http://*:8004" -- ip="127.0.0.1" --port= 8004;监控的端口号为8004;

 

然后启动调用GetCrossDomainDataApi的项目:试试看;如图8 图9

图8

命令启动了;监控的是8004端口

图9

调用TestApi 方法;让其执行InvokeApi方法,去调用

GetCrossDomainDataApi;

执行结果:如图10

图10  

结果拿到了;避开了跨域问题;

那就是解决跨域问题的第一种策略:通过后台模拟Http请求,去调用Api,可以避开跨域问题;因为跨域是因为浏览器的同源引发的、不使用非同源的脚本去调用时Ok的;是不是很棒? 

这是第一种策略:我们再往下分析;看看刚刚在调用的时候,报的错是什么?

Access to XMLHttpRequest at 'http://localhost:64304/api/CrossDomain/GetCrossDomainData' from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

其实这个提示也很明确哦:提示请求上下文不存在“Access-Control-Allow-origin” 头信息;那是不是加上这个头信息就Ok了呢?来试试看:请看下图11;仅仅只是加了一段代码。

图11

再来试试。。。来运行起来!还是命令启动:dotnet Zhaoxi.Core.WebApi.dll --urls="http://*:8004" --                          ip="127.0.0.1" --port= 8004 如图12

图12

Ajax调用:如图13  图14

图13

图14

这其实也是解决跨域的常用方法;就是在浏览器直接标记告诉调用者,Ok,我这个Api是允许你跨域访问的;仅此而已,是不是很简单?

不过如果用这种方法来支持跨域,难道在每个方法中都标记:HttpContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");这句话吗?这很显然很不爽;

还记不记得,前面的文章中写了ActionFilter的使用?在这里是不是很适合?

OK 马上给你实现一个,定义个Filter,标记在方法上,如果需要所有Api 都跨域的话,全局注册即可;请看下图15  图16

图15

图16

测试结果如下:没毛病,完美解决问题;如图17

图17

以上也是解决跨域问题的常用策略;是通过在服务器指定当前Api允许跨域访问的方式;

下面我将继续给大家分享一种解决跨域问题的方式:其实在AspNetCore 中已经有支持跨域的Api;听我慢慢道来;

第一步:Nuget引入程序包:Microsoft.AspNetCore.Cors.dll

第二步:注册跨域服务:如图18

   

图18

 

第三步:use 跨域中间件:如图19

图19

 

测试结果如下:图20

图20

这里一共介绍了三种支持跨域的方式:

1.   通过后台模拟Http请求跨域

2.   服务器标记头信息 context.HttpContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");

3.   通过定义ActionFilter支持跨域其实和第二种原理一样;

4.   通过AspNetCore封装好的Cors来支持跨域;

下期预告

【朝夕Net社区技术专刊】

论ORM框架—EntityFrameworkCore

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310906.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业数字化转型解决方案

2020年国务院常务会议明确指出,依托工业互联网促进传统产业加快上线上云。此前,工信部也在全国工业和信息化工作会议上表示,2020年要实施“5G工业互联网”512工程。和5G、人工智能等同列的“新基建”,工业互联网成为数字时代的基础…

网站 asp和php的用途,asp和php都有什么功能?

ASP是什么?有什么功能?ASP.NET是微软开发,建立动态的,强大的,智能的、可扩展的网站和网际网络应用的全功能的程序语言如C或VB.NET #。它包括一个强大的安全评估的亮点,以及一个组织的小工具,可以…

ASP.NET Core 3.x - Endpoint Routing 路由体系的内部机制

Endpoint是什么?Endpoint简单的可以理解为这样的一些类,它们包含一个请求的委托(Request Delegate)和其它的一些元数据,使用这些东西,Endpoint类可以生成一个响应。而在MVC的上下文中,这个请求委…

java获取主机信息大全,网络编程:Java获取网络主机信息

java.net.InetAddress类表示互联网协议 (IP) 地址。有两个子类:Inet4Address, Inet6Address通过 InetAddress可以方便获取一个域名下的IP,也可以获取一个IP的主机名。下面是例子,通过程序查看51cto主机的IP信息,51cto是…

【项目升级】单库、多库、读写分离 · 任你选

本期配套视频:https://www.bilibili.com/video/BV1BJ411B7mn?p6(点击阅读原文,可看,如果没有,最晚下午可看)继上周增加【任务调度】以后,继续对项目进行2.0版本升级,其实改动的地方…

.Net微服务实战之技术选型篇

王者荣耀 去年我有幸被老领导邀请以系统架构师的岗位带技术团队,并对公司项目以微服务进行了实施。无论是技术团队还是技术架构都是由我亲自的从0到1的选型与招聘成型的,此过程让我受益良多,因此也希望在接下来的系列博文尽可能的与大家分享…

autohotkey php,Autohotkey+php实现免浏览器听录音

环境说明:Elastix 2.5ln -s /var/spool/asterisk/monitor /var/www/html/接口文件(php):$conmysql_connect("localhost","root","passwd");if(!$con) echo "没有连接成功!";mysql_select_db("asteriskcdrd…

.NET Core开发实战(第32课:集成事件:解决跨微服务的最终一致性)--学习笔记...

32 | 集成事件:解决跨微服务的最终一致性首先看一下集成事件的工作原理它的目的时为了实现系统的集成,它主要是用于系统里面多个微服务之间相互传递事件集成事件的实现方式有两种,一种是图上显示的发布订阅的方式,通过 EventBus&a…

Dapper操作MySQL数据库获取JSON数据中文乱码

在项目中利用Dapper将JSON数据存储到MySQL数据库,结果发现JSON数据中的中文乱码,特此记录,希望对存储JSON的童鞋能有所帮助,文中若有错误之处,还望批评指正。为了引出最终问题出在什么地方,我们重头开始进行…

C++set容器去重法

给出一个10位数&#xff0c;它如果每个位的数都把0-9这10个数都只用了一次&#xff0c;就输出yes&#xff0c;否则输出no #include <iostream> #include <set> using namespace std; set<int>s; typedef long long LL;int main() {LL n;while (cin >>…

流传在程序员中的传说,你知道几个?

在号称从事高薪新 科技工作的程序员周遭流传着许多与他们单纯气质不符的传说在这些被神秘面纱笼罩的人群中即使是从事着同一工种都有着许许多多科学无法解释的差异老程序员们对此讳莫如深新程序员们却有时感到惶恐不安...这背后究竟是道德的扭曲还是人性的沦丧倒是都并不至于只…

C++关于getline()和getchar()的小点

getchar只能“吃”一个字符&#xff0c;而getline可以“吃”一行字符 代码如下: #include <iostream> #include <cstring> using namespace std;int main() {char c;cin>>c;string line;getline(cin,line);cout<<c<<endl;cout<<line<…

谁说docker-compose不能水平扩展容器、服务多实例?

❝虽说我已经从docker-compose走上了docker swarm的邪门歪道&#xff0c;目前被迫走在k8s这条康庄大道&#xff0c; 但是我还是喜欢docker-compose简洁有效的部署方式。❞曾其何时docker-compose非常适合开发、测试、快速验证原型&#xff0c;这个小工具让单机部署容器变得简洁…

.NET Core开发实战(第33课:集成事件:使用RabbitMQ来实现EventBus)--学习笔记(上)...

33 | 集成事件&#xff1a;使用RabbitMQ来实现EventBus这一节我们来讲解如何通过 CAP 组件和 RabbitMQ 来实现 EventBus要实现 EventBus&#xff0c;我们这里借助了 RabbitMQ&#xff0c;它的整个安装和使用的体验是非常人性化的&#xff0c;如果是在 Windows 下开发的话&#…

nginx php iconv,Nginx +PHP部署一

Nginx PHP部署一Alvin.zeng目录一、安装PHP1、Yum安装需要的包yum -y install gcc gcc-c autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurs…

以Blog.Core的方式来打开Abp.vNext

&#xff08;发现Abp这个logo真像佐助写轮眼&#xff09;最近自己的框架已经基本的成型了&#xff0c;当然还有很多质疑的地方&#xff0c;比如这些人是这么说的&#xff0c;基本都是原文&#xff1a;你的教程太乱了&#xff0c;和框架代码都不一样&#xff08;&#xff1f;&am…

算法题目中常见的几种输入小点-gets,cin,scanf,getline,sstream

cin,scanf遇到空格都会停下来。gets可读入空格 例如: 在这里由于要读入空格&#xff0c;我们用gets来读入。 const int N 8; char g[N][N];while(gets(g[0])!NULL) {gets(g[1]);}C关于getline()和getchar()的小点C stringstream输入方式下面这两段代码要注意一下: const in…

如何做好一个开源项目(一)

做好一个开源项目其实是一件比较费时费力费心的工作&#xff0c;它的最大难点除了代码维护之外&#xff0c;还包括后期的维护和持续的跟进。我曾经做过不少开源项目&#xff0c;但是坚持下来的&#xff0c;目前有信心能够持续维护的也只有Magicodes.IE。这里请允许我来一波硬广…

Abp商业版 - Identity Server模块

该模块提供了Identity Server的集成和管理功能.建立在IdentityServer4类库之上.管理系统中的客户端,身份资源和API资源(Clients, Identity resources, API resources)设置客户端(Clients)权限.轻松创建标准的身份资源(例如role, profile)创建自定义身份资源(identity resources…

洛谷 P1162 填涂颜色-dfs染色法

输入: 6 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1 1 1 1 1 1 1输出: 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 2 2 1 1 1 2 2 2 1 1 2 2 2 2 1 1 1 1 1 1 1代码如下: #include <iostream> using namespace std; const int N 40; int mp[N][N], mps[N][N…