本文主要针对网上各种跨域请求的总结,并加入自己的验证判断,实现工作中遇到的跨域问题。所涉及到的领域很小,仅仅局限于: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. ExtJs特点、优缺点及注意事项

    摘自:ExtJs特点.优缺点及注意事项 1.什么是ExtJs?ExtJS可以用来开发RIA也即富客户端的AJAX应用,是一个用javascript写的,主要用于创建前端用户界面,是一个与后台技术无关的 ...

  2. csharp: Export or Import excel using NPOI

    excel 2003: using System; using System.Collections.Generic; using System.ComponentModel; using Syste ...

  3. dstat 备忘

    http://dag.wiee.rs/home-made/dstat/#download https://github.com/dagwieers/dstat http://lhflinux.blog ...

  4. 【洛谷 p3374】模板-树状数组 1(数据结构)

    题目:已知一个数列,你需要进行下面两种操作:1.将某一个数加上x:2.求出某区间每一个数的和. 解法:树状数组求前缀和. #include<cstdio> #include<cstd ...

  5. python pip 升级每个包

    pip本身不自带升级所有包的功能, 但可以通过下面的脚本实现. import pip from subprocess import call for dist in pip.get_installed ...

  6. ahjesus不断完善的js小"内裤"

    String.prototype.isNullOrWhiteSpace = function () { /// <summary> /// 变量是undefined或者null或者空字符串 ...

  7. 从网络中获取图片显示到Image控件并保存到磁盘

    一.从网络中获取图片信息: /// <summary> /// 获取图片 /// </summary> /// <param name="url"&g ...

  8. JavaScript Array(数组)对象

    一,定义数组 数组对象用来在单独的变量名中存储一系列的值. 创建 Array 对象的语法: new Array(); new Array(size); new Array(element0, elem ...

  9. xampp 访问出现New XAMPP security concept 解决办法

    最近通过手机访问本地服务器时出现以下问题: Access forbidden! New XAMPP security concept: Access to the requested director ...

  10. 创建第一个Android 5.0应用程序

    1.新建一个Andriod项目,并配置相关参数 2.接着下一步 3.接着下一步,配置相关参数 4.完成后出现下面界面 5.运行此项目 6.你可以在菜单中看到刚才新建的Helloworld app图标