什么是跨域请求?

这一点不用我说了吧,想必看这篇文章的您正深刻体会着,心情估计是这样的,接下来估计是这样的,看完这篇文章预祝您是这样的(请原谅我的调皮)。


CORS(Cross Origin Resource Sharing)是如何工作的?

CORS 是通过向跨域请求的 Rquest、Response 添加HTTP Header来实现的 -- 客户端需要标明来源( Origin),服务端反馈是否接受这个来源( Access-Control-Allow-Origin)。但是有个大前提是,服务端必须支持CORS!

简单请求

对于简单的跨域请求(即 GETs,POSTs,而且没有设置头部,请求体也是 plain text 或者 form data),浏览器就会给头部加上额外加上Origin 来标明来源, 如下就是一个简单的跨域请求(我在http://jquery.com/ 站点的console 下执行的):
$.ajax({
	url : 'http://localhost/corstest/index',success:function (data) { console.log(data)	}
});
Request Header:
Origin:http://jquery.com

Error:
XMLHttpRequest cannot load http://localhost/corstest/index. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://jquery.com' is therefore not allowed access.
原因是服务器的Response没有返回 'Access-Control-Allow-Origin'头部来表明这个请求是被允许的

下面我们来修改下服务器端的代码,如下设置 'Access-Control-Allow-Origin'头部以允许'http://jquery.com' 访问(可设成"*"允许任何请求)
public class IndexController : Controller
{
    public string Index()
    {
        response.addheader("Access-Control-Allow-Origin","http://jquery.com");
        return "Hello World";
    }
}
从新请求,一切OK!
Response Header:
Access-Control-Allow-Origin:http://jquery.com

预飞请求(Preflighted Requests)

当有下列情况的时候,浏览器会发送预飞请求
  1. 使用除GET、POST 、HEAD外的 HTTP Method
  2. 有自定义头部
  3. Content-Type使用除 text/plain,application/x-www-form-urlencoded,或者 multipart/form-data外的类型,比如 application/json
例如执行如下请求(仍然是在http://jquery.com/ 站点的console 下执行):
$.ajax({
	url : 'http://localhost/corstest/index',headers: {'From':'elvin'},//这里自定义了一个 From header	 
	success:function (data) { console.log(data)	}
});
Request Header:
Request URL:http://localhost/corstest/index
Request Method:OPTIONS
...
Access-Control-Request-Headers:accept,from
Access-Control-Request-Method:GET
Origin:http://jquery.com

Error:
XMLHttpRequest cannot load http://localhost/corstest/index. Request header field From is not allowed by Access-Control-Allow-Headers.

需要注意的是 Request Method 是 OPTIONS,就是那个“预飞”, 这个请求是浏览器自动发出的!
报错的意思是说,服务端没有返回 Access-Control-Allow-Header来标明这个自定义header 是允许的。

下面我们调整下我们的服务端代码:
public class IndexController : Controller
{
    public string Index()
    {
        response.addheader("Access-Control-Allow-Origin","*"); 

        if (Request.HttpMethod == "OPTIONS")
        {
            response.addheader("Access-Control-Allow-Headers","From"); 
            Response.End();
        }

        return "Hello World";
    }
}
然后再次请求,一切OK!
Response Header:

Access-Control-Allow-Headers:From
Access-Control-Allow-Origin:*


相关阅读:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
http://www.w3.org/TR/cors/#access-control-allow-origin-response-header
http://techblog.constantcontact.com/software-development/using-cors-for-cross-domain-ajax-requests/

【AJAX】Ajax 跨域请求解决方案 - Using CORS的更多相关文章

  1. HTML5 3D书本翻页动画的实现示例

    这是一款十分炫酷的HTML5 3D书本翻页动画,效果相对比较简单,拖拽鼠标模拟用手翻页,需要的朋友们下面随着小编来一起学习学习吧

  2. 使用postMessage让 iframe自适应高度的方法示例

    这篇文章主要介绍了使用postMessage让 iframe自适应高度的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. ios – UIPopoverController出现在错误的位置

    所以我花了一些时间寻找答案,但到目前为止还没有找到任何答案.我正在尝试从UIInputAccessoryView上的按钮呈现弹出窗口.UIBarButtonItem我想显示popover来自定制视图,所以我可以使用图像.我创建这样的按钮:当需要显示popover时,我这样做:但我得到的是:弹出窗口看起来很好,但它应该出现在第一个按钮上时出现在第二个按钮上.然后我发现了这个问题:UIBarButto

  4. ios – 无法在UITableViewCell的drawRect中绘制

    我在使用自定义UITableViewCell的drawRect方法时遇到了麻烦.这是我正在使用的代码我已经调试过以确保所有数值都有意义,看起来它们确实存在.无法真正找出屏幕上没有任何内容的原因.值得一提的是,这也是一个在笔尖中定义的单元格.我正在使用iOS7sdk构建.有任何想法吗?tahnks解决方法你可能不应该在UITableViewCell自己的drawRect中这样做.而是创建一个自定义UIView并将其添加为子视图.另见thisanswer.

  5. UITableView在iOS 7中,在单元格中编辑UITextView时,不滚动到正确的位置

    我有一个静态单元的表视图.一个单元格包含一个UITextView,并且heightForRowAtIndexPath:是动态计算的,因此单元格总是足够高以容纳文本(该部分在iOS7下实现了一些工作,实际上,因为不可能简单地询问textView的contentSize).当我在文本视图中点击开始编辑时,键盘动画到位,tableView上的contentInsets会自动调整,以解决这个问题(即iPh

  6. ios – 找不到金属’质地’

    随着每个基于Metal的ImageView的实现,我都面临同样的问题Valueoftype‘MTLDrawable’hasnomember‘texture’好像苹果改变了一些金属api这是我试用的全部功能:解决方法执行系统和xcode更新后,我遇到了同样的问题.在更新过程中,xcode将构建目标切换到模拟器.一旦我将目标切换回设备,它就会再次编译.

  7. ios – 计算UITextField基线位置

    我试图通过编程方式将UITextField的实例的基线与UIButton的实例对齐.我正在处理这个计算类似于here描述的方式,但是使用UITextField可以有一个偏移的内容.任何想法如何获得UITextField中的文本位置甚至更好,是否有一个更简单的方法来对齐基线?解决方法在我的经验中,与UIButton不同,UITextField在文本周围实际上并没有任何偏移.无论如何,您可以在两个控件中找出确切的文本框:

  8. ios – UISearchController不重新显示旋转导航栏

    我已经实施了UISearchController,除了…解决方法看起来UISearchController忘记在状态栏重新出现时重新设置searchBar的框架.我认为这可能是UISearchController中的一个错误;似乎有一些列在radar.似乎searchBar的超级视图最终以错误的高度.这是令人烦恼的,因为解决方案因此涉及到SearchController的视图层次结构,哪个苹果可以改变…

  9. 键盘隐藏了IOS中的文本字段

    90个我在IOS中使用带有一些文本字段的scrollview创建了一个表单.视图看起来像这样,当我开始编辑州或以下字段时,键盘会隐藏该字段.像这样,我该怎么做才能看到下面的字段?

  10. ios – 在viewDidLayoutSubviews中更改帧

    我是否需要添加某种标志来检查动画是否已经运行?

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到<input>中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部