1.同源策略(Same-orgin policy)限制了一个源(orgin)中加载脚本或脚本与来自其他源(orgin)中资源的交互方式。
如果两个页面拥有相同的协议(protocol),端口(port)和主机(host),那么这两个页面就属于同一个源(orgin)。
同源之外的请求都可以称之为跨域请求。
我们可以简单粗暴地理解为同一站点下的资源相互访问都是同源的,跨站点的资源访问都是跨域的
由于同源策略,一般来说不允许JavaScript跨域访问其他服务器的页面对象,但是HTML的<script>元素是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。
HTTP协议是Web的标准之一,HTTP协议包含一些标准的操作方法,例如:GET, POST, PUT, Delete等,用这些方法能够实现对Web资源的CURD操作,下表列出了这些方法的操作定义。
HTTP方法 |
资源处理 |
说明 |
GET |
读取资源(Read) |
获取被请求URI(Request-URI)指定的信息(以实体的格式)。 |
POST |
创建资源(Create) |
在服务器上创建一个新的资源,并返回新资源的URI。 |
PUT |
更新资源(Update) |
指定URI资源存在则更新资源,指定URI资源不存在则创建一个新资源。 |
DELETE |
删除资源(Delete) |
删除请求URI指定的资源。 |
在REST应用中,默认通过HTTP协议,并且使用GET、POST、PUT和DELETE方法对资源进行操作,这样的设计风格和Web标准完全契合。
REST的最佳应用场景是公开服务,使用HTTP并遵循REST原则的Web服务,我们称之为RESTful Web Service。RESTful Web Service从以下三个方面进行资源定义:
下图展示了RESTful Web Service的执行流程
基于$.ajax声明一个简单的AjaxHelper构造器,AjaxHelper构造器的原型对象包含5个方法,分别用于处理GET, POST, PUT, DELETE和JSONP请求。
function AjaxHelper() {
this.ajax = function(url, type, dataType, data, callback) {
$.ajax({
url: url,
type: type,
dataType: dataType,
data: data,
success: callback,
error: function(xhr, errorType, error) {
alert(‘Ajax request error, errorType: ‘ + errorType + ‘, error: ‘ + error)
}
})
}
}
AjaxHelper.prototype.get = function(url, data, callback) {
this.ajax(url, ‘GET‘, ‘json‘, data, callback)
}
AjaxHelper.prototype.post = function(url, data, callback) {
this.ajax(url, ‘POST‘, ‘json‘, data, callback)
}
AjaxHelper.prototype.put = function(url, data, callback) {
this.ajax(url, ‘PUT‘, ‘json‘, data, callback)
}
AjaxHelper.prototype.delete = function(url, data, callback) {
this.ajax(url, ‘DELETE‘, ‘json‘, data, callback)
}
AjaxHelper.prototype.jsonp = function(url, data, callback) {
this.ajax(url, ‘GET‘, ‘jsonp‘, data, callback)
}
AjaxHelper.prototype.constructor = AjaxHelper
var ajaxHelper = new AjaxHelper()
var demo = new Vue({
el: ‘#app‘,
data: {
gridColumns: [‘customerId‘, ‘companyName‘, ‘contactName‘, ‘phone‘],
gridData: [],
apiUrl: ‘http://localhost:15341/api/Customers‘
},
ready: function() {
this.getCustomers()
},
methods: {
getCustomers: function() {
// 定义vm变量,让它指向this,this是当前的Vue实例
var vm = this,
callback = function(data) {
// 由于函数的作用域,这里不能用this
vm.$set(‘gridData‘, data)
}
ajaxHelper.get(vm.apiUrl, null, callback)
}
}
})
由于客户端和服务端Web API是分属于不同站点的,它们是不同的源,这构成了跨域请求。
这时请求是失败的,浏览器会提示一个错误:
No ‘Access-Control-Allow-Origin‘ header is present on the requested resource. Origin ‘http://127.0.0.1::8020‘ is therefore not allowed access.
现在碰到了请求跨域的问题,结合前面讲的一些概念,我们大致可以猜到解决跨域请求的两种方式:
这两种跨域解决方案的区别是什么呢?
选择JSONP还是CORS?除了极少数的情况,我们都应当选择CORS作为最佳的跨域解决方案。
原文:https://www.cnblogs.com/benbenjia/p/12058710.html