本文主要针对网上各种跨域请求的总结,并加入自己的验证判断,实现工作中遇到的跨域问题。所涉及到的领域很小,仅仅局限于:AngularJS CORS post 并同时需要实现json数据传送给服务器。

首先,(博文是互相转载,也没有看出原作者和原网站,我摘写其中一段:)$http.post实现跨域:

在服务器端设置允许在其他域名下访问,及响应类型、响应头设置

response.setHeader("Access-Control-Allow-Origin","*");

response.setHeader("Access-Control-Allow-Methods","POST");

response.setHeader("Access-Control-Allow-Headers","x-requested-with,content-type");

AngularJS端使用$http.post(),同时设置请求头信息

$http.post(url,{languageColumn:'name_eu'},{'Content-Type':'application/x-www-form-urlencoded'}).success(function(data) {

//…

});

当然,在我的项目中需要传递的是json格式的数据,所以需要在客户端的content-type中设置如下(如果服务器端没有设置"Access-Control-Allow-Headers","x-requested-with,content-type",下面的设置浏览器会报错):

'Content-Type':'application/json'

CORS分简单请求和复杂请求

并不是所有的跨域请求都会发送OPTIONS请求,按照这个区别,CORS分为简单请求和复杂请求,简单请求不发送OPTIONS。

HTTP的header通常包含下面这些内容:

"Accept

Accept-Language

Content-Language

Last-Event-ID

Content-Type的值仅是下列之一:

application/x-www-form-urlencoded

multipart/form-data

text/plain

HTTP方法是HEAD GET POST之一,同时HTTP的header包含如上面所示,任何一个不满足这两种要求的请求,都是复杂请求,比如发送put,delete等http动作,或者Content-Type:application/json的内容。

只有复杂请求包含"预检"这一动作,另外Access-Control-Max-Age应该也会影响OPTIONS请求的发送。

另外,在《AngularJS权威指南》一书中有关跨域与同源策略问题,也有专门的讲述,这里是总结概要:

浏览器在全局层面禁止了页面加载或执行与自身来源不同的域的任何脚本。

同源策略允许页面从同一个站点加载和执行特定的脚本。浏览器会比较每一个资源的协议、主机名和端口号来判断资源是否与页面同源。站外其它来源的脚本同页面的交互则被严格限制。

跨域资源共享(Cross Origin Resource Sharing,CORS)是一个解决跨域问题的好方法,从而可以使用XHR从不同的源加载数据和资源。跨域是很久之前就有的需求,但是CORS这种方法却比较新,以前使用的是JSONP除此以外,还有一种叫做服务器代理的方法,我比较中意CORS,它不好的地方应该很少,比如,在古老的浏览器(IE8以及之前)中没有得到支持。但是对于移动端开发来说,这个可以不用考虑。

CORS实现方法在上面已经写到,并且就是基于AngularJS实现,所以这里就不再重复,但是,关于CORS分类中的非简单请求,《AngularJS权威指南》这本书有一些介绍,应该会对开发工作有所启发。

如果想要支持PUT或DELETE方法,又或者想给请求设置特殊的内容类型,就需要发送非简单请求。对于非简单请求,浏览器采用了不同的处理方式,发送两个请求:预请求和请求。

预请求是想服务器请求许可,有了服务器的许可才可以获取服务器的数据,也就是执行真正的请求。

浏览器发送的预请求是OPTIONS类型的,预请求中包含以下头信息:

Access-Control-Request-Method

Access-Control-Request-Headers    这个header的值是可选的,可以是以逗号分隔的非简单头列表。

服务器必须接受这个请求,然后检查HTTP方法和头的合法性。如果通过了检查,服务器会在响应(response)中添加下面这些头参数:

Access-Control-Allow-Origin    这个头的值必须和请求来源相同,或者是*代表允许任何来源的请求

Access-Control-Allow-Methods 设置HTTP方法的列表,列表中的项浏览器端才可以使用。

Access-Control-Allow-Headers 如果浏览器端请求设置了Access-Control-Request-Headers头,服务器端必须在响应中添加同一个头参数。

我们希望服务器在可以接受这个请求时返回200状态码,如果服务器返回来200状态码,真正的请求才会发出。

tips:CORS并不是安全机制,只是现代浏览器实现的一个标准。应用的安全策略还需要在项目全局的角度考虑与控制。

AngularJS跨域请求的更多相关文章

  1. Angularjs 跨域请求

    不知道什么意思修改了service 参考http://blog.csdn.net/hj7jay/article/details/51767805 http://blog.csdn.net/tangsl ...

  2. Angularjs之如何在跨域请求中传输Cookie

    一般情况我们在使用WebApi之类的技术时,都会遇到跨域的问题,这个只需要在服务端做一下处理即可. 如果这些GET或POST请求不需要传递Cookie数据的话,就没什么问题了,但如果需要,那么会发现 ...

  3. AngularJS实现跨域请求

    跨域,前端开发中经常遇到的问题,AngularJS实现跨域方式类似于Ajax,使用CORS机制. 下面阐述一下AngularJS中使用$http实现跨域请求数据. AngularJS XMLHttpR ...

  4. Angularjs跨域

    一.首先我们要明白跨域的字面概念,读过留过印象之后,下面将会有例子进一步解释 有一篇文章<跨域的理解与实现>描述得很清楚,在这里摘录如下: 域(Domain)是Windows网络中独立运行 ...

  5. angularjs跨域post解决方案

    转自:http://www.thinksaas.cn/topics/0/34/34536.html 前端同学李雷和后台同学韩梅梅分别在自己电脑上进行开发,后台接口写好的时候,李雷改动完就把前端代码上传 ...

  6. Chrome本地跨域请求设置,实现HTML模板页

    按照需求,公司现在需要通过第三方的API反馈的数据,进行在本地就可以打开的静态页面程序(完全脱离IIS等服务器).为了更好的维护项目,需要实现静态HTML引入HTML模板,完成ASP.NET模板页的类 ...

  7. Laravel中的ajax跨域请求

    最近接触Laravel框架ajax跨域请求的过程中遇到一些问题,在这里做下总结. 一开始发起ajax请求一直报500错误,搜索相关资料后发现Laravel要允许跨域请求可以加入Cors中间件,代码如下 ...

  8. 跨域请求——WebClient通过get和post请求api

    AJAX不可以实现跨域请求,经过特殊处理才行.一般后台可以通过WebClient实现跨域请求~ //get 请求        string url = string.Format("htt ...

  9. 原生js封装ajax,实现跨域请求

    描述: 需要ajax跨域请求,用cors跨域方案.服务端设置: header('Access-Control-Allow-Origin: http://front.ls-la.me'); header ...

随机推荐

  1. U-boot的环境变量值得注意的有两个: bootcmd 和bootargs

    本文转载至:http://www.cnblogs.com/cornflower/archive/2010/03/27/1698279.html U-boot的环境变量值得注意的有两个: bootcmd ...

  2. 修改RectTransform的值

    用uGUI的时候.经常需要动态改变RectTransform的值,

  3. spring aop advice

    1.前置通知(BeforeAdvice): import java.lang.reflect.Method; import org.springframework.aop.MethodBeforeAd ...

  4. 【洛谷 P3385】模板-负环(图论--spfa)

    题目:有一个图有N个顶点,M条边.边用三个整数a b w表示,意思为a->b有一条权值为w的边(若w<0则为单向,否则双向).共T组数据.对于每组数据,存在负环则输出一行"YE5 ...

  5. 那一夜,我们..奋笔疾书敲出的--->>库存管理系统

    说了会再见,最近好吗?无论你在哪里>也许你在温暖的家,或许你在身在异乡的城市;或许你高高的峰顶放生高歌,或许你还在陡峭的山峰半空努力攀爬.......相信我们都会登上顶峰,"会当凌绝顶 ...

  6. 依赖于spring 4.x的spring组件

    1.Spring Data MongoDB 1.6.x开始依赖于spring 4.x: 2.@Conditional注解: 3.spring-data-redis 1.4.x开始依赖于spring 4 ...

  7. 如何通过PowerShell在Visual Studio的Post-build中预热SharePoint站点

    问题现象 Visual Studio在开发SharePoint的时候,发布部署包后,首次打开及调试站点页面的时候会非常的慢 解决方案 使用PowerShell脚本,加载SharePoint插件后遍历所 ...

  8. Force.com微信开发系列(六)客服接口

    当用户主动发消息给微信公众账号的时候(包括发送信息.点击自定义菜单click事件.订阅事件.扫描二维码事件.支付成功事件.用户维权),微信将会把消息数据推送给开发者,开发者在一段时间内(目前为48小时 ...

  9. SharePoint通过stsadm备份和还原子网站(不是网站集)

    大家都知道SharePoint的stsadm命令提供了很多便捷甚至是唯一的操作方法! 这里列出的所有命令:http://www.cnblogs.com/dadongzuo/archive/2013/0 ...

  10. 转载:sql关联查询

    inner join(等值连接)只返回两个表中联结字段相等的行 left join(左联接)返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接)返回包括右表中的所有记录和 ...