.NET Core2.0 +Vue2.0 三种跨域方法对比

一、为什么会出现跨域的问题​ 何为同源?只有当协议、端口、和域名都相同的页面,则两个页面具有相同的源。只要网站的 协议名protocol、 主机host、 端口

大家好,如果您还对.NET Core2.0 +Vue2.0 三种跨域方法对比不太了解,没有关系,今天就由本站为大家分享.NET Core2.0 +Vue2.0 三种跨域方法对比的知识,包括的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

二、如何达到跨域的目的——三种跨域方式 之JsonP

我一一创建静态页面来模拟前端访问。具体步骤如下:

1、新建一个Html页面,使用Jquery发送请求(文件在项目的WWW文件夹下,可以自己下载,或者复制下面的代码)。

跨域方法一共有三种

!DOCTYPE htmlhtmlhead meta charset=’utf-8′ titleBlog.Core/标题脚本src=’https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js’/script 样式div { margin: 10px; word-wrap: 中断-word; } /style 脚本$(document).ready(function () { $(‘#jsonp’).click(function () { $.getJSON(‘http://localhost:58427/api/Login/jsonp?callBack=?’, function (data ) { $(‘#data-jsonp’).html(‘data: ‘ + data.value); }); $(‘#cors’).click(function () { $.get(‘http://localhost:58427/api/登录/令牌’, function (data, status) { $(‘#status-cors’).html(‘status : ‘ + status); $(‘#data-cors’).html( ‘数据: ‘ + 数据); }); /script/headbody h3 通过JsonP 实现跨域请求/h3 button id=’jsonp’ 发送GET /button div id=’status-jsonp’/div div id=’data-jsonp’/div hr/h3 添加请求header实现跨域/h3 hr/h3通过CORS实现跨域请求,还需要在server段配置CORE/h3 Button id=’cors’发送一个GET /button div id=’status-cors ‘/div div id=’data-cors’/div hr //body/html 注意:这里一定要注意jsonp的前端页面请求写法,要求非常严格

2、将此页面部署到自己的IIS中(复制到文件中,直接将文件添加到iis中,访问刚才的Html文件目录即可)

3.在我们的项目LoginController中,设计Jsonp接口。我们已经有了Core调用的接口,就是之前获取Token的接口GetJWTStr。

[HttpGet] [Route(‘jsonp’)] public void Getjsonp(string callBack, long id=1, string sub=’Admin’, int expiresSliding=30, int expiresAbsoulute=30) { TokenModel tokenModel=new TokenModel(); } tokenModel .Uid=id; tokenModel.Sub=sub;日期时间d1=日期时间.Now; DateTime d2=d1.AddMinutes(expiresSliding);日期时间d3=d1.AddDays(expiresAbsoulute);滑动时间跨度=d2 – d1;绝对时间跨度=d3 – d1;字符串jwtStr=BlogCoreToken.IssueJWT(tokenModel,滑动,绝对); //重要,必须这样写string response=string.Format(‘\’value\’:\'{0}\”, jwtStr);字符串调用=callBack + ‘({‘+response+’})’; Response.WriteAsync(调用); }注意:这里一定要注意jsonp接口的写法,要求非常严格

4、点击“通过JsonP跨域请求”按钮,发现已经有数据了,证明Jsonp跨域已经成功。你可以用自己的域名试试,但是Cors的还不行。

三、如何达到跨域的目的——三种跨域方式 之添加请求头实现跨域

这里我没有把它写到代码中,之前在通用处理程序中使用过。

后端

public void ProcessRequest(HttpContext context) { //接收参数字符串uName=context.Request[‘name’]; string data='{\’姓名\’:\” + uName + ‘\’,\’年龄\’:\’18\’}’; //在服务端添加下面两句即可context.Response.AddHeader(‘Access-Control-Allow-Origin’, ‘*’); //如何进行跨域请求context .Response.AddHeader(‘Access-Control-Allow-Methods’, ‘POST,GET’);上下文.Response.Write(数据); }前端

.NET Core2.0 +Vue2.0 三种跨域方法对比

function ashxRequest() { $.post(‘http://localhost:5551/ashxRequest.ashx’, { name: ‘halo’ }, function (data) { for (var i in data) {alert(data[i]); } }, ‘json ‘) } 如果你有兴趣,可以自己实验一下。如有疑问请留言

四、如何达到跨域的目的——三种跨域方式 之 高效CORS

1.前端代码已经用jsonp编写。请阅读第二部分。后端接口也是Token接口。

剩下的就是配置跨域了,很简单!

2.在ConfigureServices中添加

#region CORS services.AddCors(c={ //注意不要在正式环境中使用这个完全开放的流程 c.AddPolicy(‘AllRequests’, policy={policy .AllowAnyOrigin()//允许任何来源.AllowAnyMethod()//允许任何方法.AllowAnyHeader()//允许任何标头.AllowCredentials();//允许cookie }); 注意正式环境中不要使用这种完全开放的流程 //一般使用这种方法c.AddPolicy(‘LimitRequests’,policy={policy .WithOrigins(‘http://localhost:8020’ , ‘http://blog.core.xxx.com’,”)//支持多个域名和端口。WithMethods(‘GET’, ‘POST’, ‘PUT’, ‘DELETE’)//在策略中添加请求方法。 WithHeaders(‘authorization’) ;//向策略添加header }) }); #endregion 有每个人都能理解的基本注释,就这么简单!

4. OK,运行调试,一切正常。

至此,跨域问题已经完成。

五、其他跨域方法补充

通过将本地URL前缀映射到需要跨域访问的Web服务器,可以实现跨域访问。

简单来说,nginx服务器欺骗浏览器认为是同源调用,从而解决浏览器的跨域问题。通过重写URL,它欺骗真实服务器,使其认为http请求直接来自用户的浏览器。

这样,要解决跨域问题,只需要更改nginx配置文件即可。

六、结语

.NET Core2.0 +Vue2.0 三种跨域方法对比

三种方法其实都可以达到目的,但是优缺点也很明显。

1.手动创建JSONP跨域

优点:无浏览器要求,该方法在任何浏览器都可以使用

缺点:格式要求非常严格,仅支持get请求方式。当请求的后端发生错误时不会有提示,导致无法处理异常。

2.添加请求头实现跨域

优点:支持任意请求方式,后端错误会像非跨域错误一样报错,并且可以处理异常

缺点:兼容性不是很好。对于IE,IE10不支持该方法。

CORS方式虽然和请求头有些类似,但是封装性、兼容性、灵活性都要好很多。强烈推荐。

七、初探DTOs

请参阅以下实体类

//数据库实体类public class Author{ public string Name { get;放; }}公共类书籍{公共字符串标题{获取;放; } 公共作者作者{ get;放; }}//页面实体类public class BookViewModel { public string Title { get;放; } 公共字符串作者{ get;放; }}//api调用BookViewModel model=new BookViewModel{ Title=book.Title, Author=book.Author.Name} 上面的例子是相当直观的,我们通常这样使用,但是问题就出现了。我们在上面的代码中可以看到,如果在Book对象中额外添加了一个字段,然后我们想要在首页输出这个字段,那么就需要找到项目中每一个有这样一个BookViewModel转换字段的地方,这是非常乏味的。另外,BookViewModel.Author是一个字符串类型字段,但Book.Author属性是Author对象类型。我们采用的解决方案是通过Book.Auther对象获取Author的Name属性值,然后赋值给BookViewModel的Author。属性,这个貌似可行,但是想一想,如果你打算在以后的开发中把Name拆成两个——FisrtName和LastName,天啊!我们要把原来的ViewModel对象拆分成对应的两个字段,然后找到项目中所有的转换,然后替换掉。

那么有没有什么方法或者工具可以帮助我们避免这种情况呢? AutoMapper是一个满足要求的插件。

只需一键即可一劳永逸解决所有问题,然后通过依赖注入即可快速使用:

用户评论

.NET Core2.0 +Vue2.0 三种跨域方法对比
从此我爱的人都像你

终于看到一篇对比 .NET Core 2.0 和 Vue 2.0 的跨域方式的文章!我自己平时主要用这两种技术,搞跨域确实让我头疼 banget. 这篇文章分析得很好,三种方式各有优缺点,总结得很到位。

    有12位网友表示赞同!

.NET Core2.0 +Vue2.0 三种跨域方法对比
←极§速

这篇文章讲得很全,特别是对 jsonp 的讲解真的很实用。以前我一直不知道 jsonp 在 .NET Core 中怎么实现的,现在算是茅塞顿开了!

    有5位网友表示赞同!

.NET Core2.0 +Vue2.0 三种跨域方法对比
空谷幽兰

看标题以为是比较两种技术的跨域处理方式,结果是三种常见的方法…有点失望啊。不过还是受益匪浅,毕竟跨域真是个令人头疼的问题。

    有16位网友表示赞同!

.NET Core2.0 +Vue2.0 三种跨域方法对比
心已麻木i

个人觉得 CORS 还是更安全、更规范的方式比较适合大型项目。JSONP 虽然简单,但安全性比较低,不建议在敏感信息传输中使用。这篇文章总结得很好!

    有10位网友表示赞同!

.NET Core2.0 +Vue2.0 三种跨域方法对比
眷恋

我偏爱使用代理的方式,这样感觉代码逻辑更清晰,维护起来也方便一些。不过跨域问题处理真的太麻烦了,希望以后能找到更简单的解决方案…

    有7位网友表示赞同!

.NET Core2.0 +Vue2.0 三种跨域方法对比
未来未必来

前端和后端协同开发真不容易… .NET Core 和 Vue 2.0 在跨域方面的处理方法真是五花八门,这篇文章把我看得眼花缭乱!

    有17位网友表示赞同!

.NET Core2.0 +Vue2.0 三种跨域方法对比
何必锁我心

文章讲得太抽象了,我希望能提供一些具体的代码示例。这样一看就更容易理解三种方法的实现方式。

    有20位网友表示赞同!

.NET Core2.0 +Vue2.0 三种跨域方法对比
如你所愿

.NET Core 的跨域方案确实比之前的版本更成熟了,感谢 Microsoft 的技术进步! 不过,Vue 2.0 和 jQuery 是常用的前端框架,希望以后能看到更多针对这些技术的跨域解决方案。

    有7位网友表示赞同!

.NET Core2.0 +Vue2.0 三种跨域方法对比
窒息

写这么详细的文章真是太不容易了,点赞! 我之前一直用 jsonp 处理跨域,但现在看来 cors 更安全,就赶紧学习一下吧!

    有7位网友表示赞同!

.NET Core2.0 +Vue2.0 三种跨域方法对比
无关风月

跨域确实是一件令人头疼的事情,希望有一天能彻底绕开这道坎。 それにしても, .NET Core 的开发体验还是不错的,使用起来很方便。

    有7位网友表示赞同!

.NET Core2.0 +Vue2.0 三种跨域方法对比
汐颜兮梦ヘ

.NET Core 的跨域方案在安全性方面做得还不错,cors 可以很好的控制请求来源,这对于保护服务器很重要!

    有14位网友表示赞同!

.NET Core2.0 +Vue2.0 三种跨域方法对比
不要冷战i

学习了,我之前没注意过 CORS 的设置,看来需要仔细阅读一下文档。这篇文章提醒了我很多问题!

    有20位网友表示赞同!

.NET Core2.0 +Vue2.0 三种跨域方法对比
坏小子不坏

个人觉得 JSONP 最容易实现,而且适用于一些简单的跨域场景。不过在实际开发中,我还是更倾向于使用 CORS 方式,毕竟安全性更高。

    有12位网友表示赞同!

.NET Core2.0 +Vue2.0 三种跨域方法对比
等量代换

我经常遇到跨域问题,这篇文章帮我找到了解决方案,非常感激作者的分享!

    有17位网友表示赞同!

.NET Core2.0 +Vue2.0 三种跨域方法对比
ok绷遮不住我颓废的伤あ

虽然三种方法各有优缺点,但我还是觉得用代理的方式实现跨域最简单直接。不过这需要前端和后端工程师协同工作才能完成,比较麻烦。

    有15位网友表示赞同!

.NET Core2.0 +Vue2.0 三种跨域方法对比
毒舌妖后

.NET Core 的跨域方案越来越完善了, 这篇文章总结得很好,以后遇到跨域问题可以直接参考一下!

    有18位网友表示赞同!

.NET Core2.0 +Vue2.0 三种跨域方法对比
罪歌

希望未来能够有一个更简单的跨域解决方案,省得我们每次开发项目都要研究各种方法…

    有12位网友表示赞同!

.NET Core2.0 +Vue2.0 三种跨域方法对比
不忘初心

写的太好了!对前端开发者和后端开发者的跨域方案都有很好的介绍。这篇文章是我这类问题的宝藏文章啦!

    有18位网友表示赞同!

.NET Core2.0 +Vue2.0 三种跨域方法对比
搞搞嗎妹妹

三种方法的优缺点分析很到位,能帮助我更好地理解如何选择合适的解决方案

    有10位网友表示赞同!

原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/97191.html

(0)
小su's avatar小su
上一篇 2024年8月29日 下午6:57
下一篇 2024年8月29日 下午6:59

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注