跨域(jsonp cors)

同源策略它是由NetScape提出的一个著名的安全策略。

浏览器执行js,会检查它属于哪个页面,如果不是同源页面,不会被执行。

由于浏览器的同源策略,只要发送请求url与页面地址有不同的即为跨域。只要协议、域名、端口任何一个不同,就是不同的域。

常见的解决方案有:

jsonp

跨域资源共享(CORS)

使用html5的window.postMessage

通过修改document.domain

使用window.name

1.jsonp

jsonp 全称是JSON with Padding,是为了解决跨域请求资源而产生的解决方案,是一种依靠开发人员创造出的一种非官方跨域数据交互协议

利用了<script>标签可以链接到不同源的js脚本,来到达跨域目的.(js脚本、css样式 、图片可以与本身页面不同源。)

  <!-- js文件载入成功后会执行我们在url参数中指定的函数,
    并且会把我们需要的json数据作为参数传入。所以jsonp是需要服务器端的页面进行相应的配合的。 -->
    <script type="text/javascript">
        function callback(jsondata) {
            console.log(jsondata);
        }
    </script>
    <script src="http://localhost:5000/api/test/get/callback?callback=callback"></script>

通过ajax调用实现

  $(function () {
            $("#btn").on("click", function () {
                $.ajax({
                    url: "http://localhost:5000/api/test/get/successCallback",
                    dataType: ‘jsonp‘,
                    jsonp: ‘mycallback‘,
                    jsonpCallback: ‘successCallback‘,
                    success: function (data) {
                        $(‘ul li‘).remove();
                        var ul = $("#ul");
                        for (var index = 0; index < data.length; index++) {
                            var element = data[index];
                            ul.append("<li>" + element + "</li>");

                        }
                    },
                    error: function(err){
                        console.log(‘error‘);
                        console.log(err.status);
                    }

                });
            })
        });

?优点:可以实现跨域,兼容性好,回调函数在本地处理

?缺点:只支持get;需要在服务器端增加callback处理;出错,不会有状态码。

2.CORS

跨域资源共享( CORS )机制允许 Web 应用服务器进行跨域访问控制,从而使跨域数据传输得以安全进行。浏览器支持在 API 容器中(例如 XMLHttpRequest 或 Fetch )使用 CORS,以降低跨域 HTTP 请求所带来的风险。

跨域资源共享标准( cross-origin sharing standard )允许在下列场景中使用跨域 HTTP 请求:

  • 前文提到的由 XMLHttpRequest 或 Fetch 发起的跨域 HTTP 请求。
  • Web 字体 (CSS 中通过 @font-face 使用跨域字体资源), 因此,网站就可以发布 TrueType 字体资源,并只允许已授权网站进行跨站调用。
  • WebGL 贴图
  • 使用 drawImage 将 Images/video 画面绘制到 canvas
  • 样式表(使用 CSSOM)
  • Scripts (未处理的异常)

需要在服务器端进行设置,以 .netCore为例:

 public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();

            services.AddCors(options => options.AddPolicy("AllowDomain",
            builder =>
            {
                builder.WithOrigins("*").AllowAnyMethod().AllowAnyHeader();
            }));

        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
             app.UseCors("AllowDomain");
            loggerFactory.AddConsole(Configuration.GetSection("Logging"));
            loggerFactory.AddDebug();
            app.UseMvc();
        }

1.简单请求

使用GET,HEAD,POST(Content-Type 为 text/plain  multipart/form-data  application/x-www-form-urlencoded)

请求过程如下图

代码:

  $("#simplebtnpost").on("click", function () {
                $.ajax({
                    type: "post",
                    data:{name:‘1111‘},
                    url: "http://localhost:5000/api/test/post",
                    success: function (datas) {
                        $(‘ul‘).empty();
                        $.each(datas, function (element) {
                            $(‘ul‘).append("<li>" + datas[element] + "</li>");
                        });

                    }
                });
            })

2.预检请求

与前述简单请求不同,“需预检的请求”要求必须首先使用 OPTIONS  方法发起一个预检请求到服务器,以获知服务器是否允许该实际请求。"预检请求“的使用,可以避免跨域请求对服务器的用户数据产生未预期的影响。

当请求满足下述任一条件时,即应首先发送预检请求:

  • 使用了下面任一 HTTP 方法:PUT;DELETE;CONNECT;OPTIONS;TRACE;PATCH
  • 人为设置了对 CORS 安全的首部字段集合之外的其他首部字段。该集合为:Accept;Accept-Language;Content-Language;Content-Type (but note the additional requirements below);DPR;Downlink;Save-Data;Viewport-Width;Width
  • Content-Type 的值不属于下列之一:;application/x-www-form-urlencoded;multipart/form-data;text/plain

请求过程:

代码:

            $("#btnput").on("click", function () {
                $.ajax({
                    type: "put",
                    url: "http://localhost:5000/api/test/put",
                    data: {
                        name: ‘测试‘,
                    },
                    dataType: "json",
                    ContentType: "application/json",
                    beforeSend: function (request) {
                        request.setRequestHeader("Content-type",
                            "application/json; charset=utf-8");
                    },
                    success: function (datas) {
                        $(‘ul‘).empty();
                        $.each(datas, function (element) {
                            $(‘ul‘).append("<li>" + datas[element] + "</li>");
                        });

                    }
                });
            })

Access-Control-Allow-Origin

响应首部中可以携带一个 Access-Control-Allow-Origin 字段,其语法如下:

Access-Control-Allow-Origin: <origin> | *

Access-Control-Allow-Methods

Access-Control-Allow-Methods 首部字段用于预检请求的响应。其指明了实际请求所允许使用的 HTTP 方法。

Access-Control-Allow-Methods: <method>[, <method>]*

Access-Control-Allow-Headers

Access-Control-Allow-Headers 首部字段用于预检请求的响应。其指明了实际请求中允许携带的首部字段。

Access-Control-Allow-Headers: <field-name>[, <field-name>]*

 

Access-Control-Allow-Credentials

Access-Control-Allow-Credentials 首部字段用于预检请求的响应,表明服务器是否允许 credentials 标志设置为 true 的请求。

Credentials可以是 cookies, authorization headers 或 TLS client certificates.

Access-Control-Allow-Credentials: true

 

Access-Control-Expose-Headers

Access-Control-Expose-Headers 首部字段指定了服务端允许的首部字段集合。(默认情况是以下六种简单响应首部(simple response headers)):cache-control,

content-language,Content-Type,Expires,Last-Modified,Pragma)

Access-Control-Expose-Headers: X-My-Custom-Header, X-Another-Custom-Header

 
 
 
 
时间: 2024-12-08 23:59:21

跨域(jsonp cors)的相关文章

14、跨域 - jsonp

## 同源策略 协议 域名 端口    3个都一致叫同域,有1个不一致叫跨域 ## 为什么浏览器不支持跨域 cookie LocalStorage DOM元素也有同源策略    iframe ajax 也不支持跨域 ## 实现跨域 -  jsonp -  cors -  postMessage -  document.domain    子域和父域 -  window.name -  location.hash -  http-proxy    反向代理 -  nginx -  websocke

Ajax请求的跨域(CORS)问题

用浏览器,通过XHR(XMLHttpRequest)请求向另外一个域名请求数据时,会碰到跨域(CORS)问题. CORS:Cross-Origin Resource Sharing 什么是跨域? 简单的来说,出于安全方面的考虑,浏览器页面中的JavaScript无法访问其他服务器上的数据,即"同源策略".而跨域就是通过某些手段来绕过同源策略限制,实现不同服务器之间的通信. 解决方法: 基本的解决思路就是利用filter在response中加入一个头"Access-Contro

跨域JSONP原理及调用具体示例

上篇博客介绍了同源策略和跨域访问概念,其中提到跨域常用的基本方式:JSONP和CORS. 那这篇博客就介绍JSONP方式. JSONP原理 在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的,但img.iframe.script等标签是个例外,这些标签可以通过src属性请求到其他服务器上的数据. 而JSONP就是通过script节点src调用跨域的请求. 当我们通过JSONP模式请求跨域资源时,服务器返回给客户端一段javascript代码,这段javascript代码自动调用客

跨域JSONP 获取内容

跨域JSONP原理及调用具体示例 分类: 小笔记 跨域 浏览器 JSONP CORS 2014-10-12 11:29 3221人阅读 评论(0) 收藏 举报 上篇博客介绍了同源策略和跨域访问概念,其中提到跨域常用的基本方式:JSONP和CORS. 那这篇博客就介绍JSONP方式.  JSONP原理 在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的,但img.iframe.script等标签是个例外,这些标签可以通过src属性请求到其他服务器上的数据. 而JSONP就是通过sc

跨域解决方案CORS使用方法

CORS(Cross-Origin Resource Sharing), 目前CORS还处于w3c的草案,它定义了跨域访问时服务器和客户端之间如何通信.他的原理是通过定义HTTP头部的信息,来让客户端和服务器互相确认,从而决定是否相应本次请求. 兼容性: IE10+  chrome21+  firefox21+  safari5.1+  opera12.1+ (IE8, 9中使用XDomainRequest) 详见 http://caniuse.com/cors , 可通过(new XMLHtt

jquery中的跨域-jsonp格式

js要跨域jsonp格式,原理就是在html中插入一端js引用去调用远程地址: <script type="text/javascript" src="http://xxx.aspx?callback=test"></script> jquery客户端代码如下: $.ajax({ type:'get', url:'http://xxxx.ashx', dataType:'jsonp', jsonpCallback参数表示服务器返回数据的标志

跨域访问CORS探究

什么是跨域? 跨域,简单地讲,就是一个Web应用(http://www.a.com)下的文档或脚本访问另一个Web应用(http://www.b.com)下的资源.任何两个应用所在域,只要存在协议.域名或端口任意一个不相同,即被认为访问是跨域的. 为什么会出现跨域访问限制? 由于浏览器同源策略,我们这里主要讨论XmlHttpRequest同源策略,XmlHttpRequest同源策略禁止XHR对象向不同源的服务器地址发送请求,这是浏览器出于安全考虑所做的限制. 使用ajax向另一个域下的应用发送

rest_framework 跨域和CORS

本节目录 一 跨域 二 CORS 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 跨域 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现. 同源策略,它是由Netscape提出的一个著名的安全策略.现在所有支持JavaScript 的浏览器都会使用这个策略.所谓同源是指,域名,协议,端口相同.当

百万年薪python之路 -- 请求跨域和CORS协议详解

楔子 什么是同源策略 同源策略,它是由Netscape提出的一个著名的安全策略.现在所有支持JavaScript 的浏览器都会使用这个策略.所谓同源是指,域名,协议,端口相同.当一个浏览器的两个tab页中分别来自127.0.0.1:8000和127.0.0.1:8001的页面,当浏览器的127.0.0.1:8000的tab页执行一个脚本的时候会检查这个脚本是属于哪个页面的,即检查是否同源,只有和127.0.0.1:8000同源的脚本才会被执行.如果非同源,那么在请求数据时,浏览器会在控制台中报一