AngularJS跨域请求
本文主要针对网上各种跨域请求的总结,并加入自己的验证判断,实现工作中遇到的跨域问题。所涉及到的领域很小,仅仅局限于: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跨域请求的更多相关文章
- Angularjs 跨域请求
不知道什么意思修改了service 参考http://blog.csdn.net/hj7jay/article/details/51767805 http://blog.csdn.net/tangsl ...
- Angularjs之如何在跨域请求中传输Cookie
一般情况我们在使用WebApi之类的技术时,都会遇到跨域的问题,这个只需要在服务端做一下处理即可. 如果这些GET或POST请求不需要传递Cookie数据的话,就没什么问题了,但如果需要,那么会发现 ...
- AngularJS实现跨域请求
跨域,前端开发中经常遇到的问题,AngularJS实现跨域方式类似于Ajax,使用CORS机制. 下面阐述一下AngularJS中使用$http实现跨域请求数据. AngularJS XMLHttpR ...
- Angularjs跨域
一.首先我们要明白跨域的字面概念,读过留过印象之后,下面将会有例子进一步解释 有一篇文章<跨域的理解与实现>描述得很清楚,在这里摘录如下: 域(Domain)是Windows网络中独立运行 ...
- angularjs跨域post解决方案
转自:http://www.thinksaas.cn/topics/0/34/34536.html 前端同学李雷和后台同学韩梅梅分别在自己电脑上进行开发,后台接口写好的时候,李雷改动完就把前端代码上传 ...
- Chrome本地跨域请求设置,实现HTML模板页
按照需求,公司现在需要通过第三方的API反馈的数据,进行在本地就可以打开的静态页面程序(完全脱离IIS等服务器).为了更好的维护项目,需要实现静态HTML引入HTML模板,完成ASP.NET模板页的类 ...
- Laravel中的ajax跨域请求
最近接触Laravel框架ajax跨域请求的过程中遇到一些问题,在这里做下总结. 一开始发起ajax请求一直报500错误,搜索相关资料后发现Laravel要允许跨域请求可以加入Cors中间件,代码如下 ...
- 跨域请求——WebClient通过get和post请求api
AJAX不可以实现跨域请求,经过特殊处理才行.一般后台可以通过WebClient实现跨域请求~ //get 请求 string url = string.Format("htt ...
- 原生js封装ajax,实现跨域请求
描述: 需要ajax跨域请求,用cors跨域方案.服务端设置: header('Access-Control-Allow-Origin: http://front.ls-la.me'); header ...
随机推荐
- Oracle客户端+PLSQLDeveloper实现远程登录Oracle数据库
Oracle数据库功能强大.性能卓越,在造就这些优点的同时,也导致Oracle占内存比较多.针对这个问题,我们如何做到取其精华去其糟粕呢? 解决方案:我们可以在局域网内的服务器上安装庞大的Oracle ...
- oracle的minus返回第一个表中有、第二个表中没有的数据
oracle的minus返回第一个表中有.第二个表中没有的数据 CREATE TABLE hovertree_union_1 ( id INT, val ) ); CREATE TABLE hover ...
- windbg学习进阶之——windbg字段名及其意义
要使用windbg分析dump必须加载正确的符号,可以通过设置Symbols File Path为"D:/Symbols;SRV*D:/Symbols*http://msdl.microso ...
- VB 2015 的 闭包(Closure)
是的,你没看错,这篇文章讲的不是 ECMAScript . 目前 VB 14 比 C# 6 领先的功能里面,有个即将在 C# 7 实现的功能,叫做"本地方法".这个功能与" ...
- A除以B问题
描述:本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数.你需要输出商数Q和余数R,使得A = B * Q + R成立. 输入:输入在1行中依次给出A和B,中间以1空格分隔. 输出: ...
- webpack打包
(1) 首先生成一个package.json文件 进入项目文件的根目录执行npm init 在根目录中生成一个package.json文件 (2)全局安装webpack 执行npm install ...
- 聊聊GISer的职业发展
一.前言 去年写了一篇名为<GISer们还有机会屌丝逆袭吗?>的博文,希望能和广大GISer一起探讨地理信息产业留给小团队和个人的机会.文章发布后,很多GISer通过网络和我进行了交流,其 ...
- 桥牌笔记L4D17:小心阻塞
南打3NT. 西的首攻会有3墩黑桃.3墩方块.2付梅花,共8墩到手.看来方块如果3-2分布的话,非常容易就能超一完成. 所以要想着4-1分布的安全打法. 第一墩庄家拿了黑桃J后,明手的黑桃A会阻塞,庄 ...
- iOS didReceiveMemoryWarning 的处理
当iOS触发didReceiveMemoryWarning这个方法的时候,我们一般会做一些手动处理,强制清理掉一些目前不用的数据.但是这个方法并不只是单纯的通知开发者你的内存已经吃紧了,系统通知你的同 ...
- Android中使用抖动动画吸引来用户注意
原文:http://www.androidcn.org/topic/552e65bc61d460226ab27a5c 在应用中,有时候我们要吸引用户去点击某些按钮,比如应用市场的推荐按钮,为了能够吸引 ...