angular.js中解决跨域问题的三种方式


Posted in Javascript onJuly 12, 2017

前言

开始本文之前,大家应该首先了解,协议、主机名和端口号相同叫同源。同源策略允许页面从同一个站点加载和执行特定的脚本。站外其他来源的脚本同页面的交互则被严格限制。

要解决这个问题就需要跨域,本文介绍解决angular中的跨域的三种方式:

一、JSONP

JSONP的原理是通过 <script> 标签发起一个GET请求来取代XHR请求。JSONP生成一个<script> 标签并插到DOM中,然后浏览器会接管并向 src 属性所指向的地址发送请求。当服务器返回请求时, 响应结果会被包装成一个JavaScript函数, 并由该请求所对应的回调函数调用。

AngularJS在 $http 服务中提供了一个JSONP辅助函数。 通过 $http 服务的 jsonp 方法可以发送请求,如下所示:

$http
  .jsonp("https://api.github.com?callback=JSON_CALLBACK") .success(function(data) {
  // 数据
  });

因为请求是由 <script> 标签发送的,所以这个方法只能发送GET请求。

二、使用 CORS
CORS规范简单地扩展了标准的XHR对象,以允许JavaScript发送跨域的XHR请求。它会通过预检查(preflight)来确认是否有权限向目标服务器发送请求。预检查可以让服务器接受或拒绝来自全部服务器、特定服务器或一组服务器的请求。这意味着客户端和服务端应用需要协同工作,才能向客户端或服务器发送数据。

首先需要告诉AngularJS我们正在使用CORS。使用 config()方法在应用模块上设置两个参数以达到此目的。

angular.module('myApp', [])
.config(function($httpProvider) {
$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers
.common['X-Requested-With'];
});

接下来,需要服务端设置响应头,这个需要和后端人员镜像
Access-Control-Allow-Origin 这个头的值可以是与请求头的值相呼应的值,为*表示允许接收从任何来源发来的请求。
Access-Control-Allow-Credentials 默认情况下,CORS请求不会发送cookie。如果服务器返回了这个头,那么就可以通过将withCredentials 设置为 true 来将cookie同请求一同发送出去。

接下来就可以使用下面的请求进行跨域请求了

$http
.get("https://api.github.com")
.success(function(data) {
// 数据
});

三、服务器端代理这种方式更多的应该是后端来做的实现向所有服务器发送请求的最简单方式是使用服务器端代理。

这个服务器和页面处在同一个域中(或者不在同一个域中但支持CORS) ,做为所有远程资源的代理。可以简单地通过使用本地服务器来代替客户端向外部资源发送请求, 并将响应结果返回给客户端。通过这种方式,老式浏览器不必使用需要发送额外请求的CORS(只有现代浏览器支持CORS)也能发送跨域请求,并且可以在浏览器中采用标准的安全策略。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
详解Javascript数据类型的转换规则
Dec 12 Javascript
JS实现HTML标签转义及反转义
Apr 14 Javascript
Bootstrap轮播图学习使用
Feb 10 Javascript
Vue.js实现实例搜索应用功能详细代码
Aug 24 Javascript
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
Oct 26 Javascript
JavaScript数据结构之单链表和循环链表
Nov 28 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
Jan 19 Javascript
vue+mock.js实现前后端分离
Jul 24 Javascript
解决layer图标icon不加载的问题
Sep 04 Javascript
layui select 禁止点击的实现方法
Sep 05 Javascript
layui上传图片到服务器的非项目目录下的方法
Sep 26 Javascript
如何利用js在两个html窗口间通信
Apr 27 Javascript
JavaScript+HTML5实现的日期比较功能示例
Jul 12 #Javascript
JavaScript实现设置默认日期范围为最近40天的方法分析
Jul 12 #Javascript
Bootstrap提示框效果的实例代码
Jul 12 #Javascript
JavaScript输出所选择起始与结束日期的方法
Jul 12 #Javascript
微信小程序三级联动地址选择器的实例代码
Jul 12 #Javascript
微信小程序 共用变量值的实现
Jul 12 #Javascript
JS中LocalStorage与SessionStorage五种循序渐进的使用方法
Jul 12 #Javascript
You might like
PHP实现简单的新闻发布系统实例
2015/07/28 PHP
详解PHP处理字符串类似indexof的方法函数
2017/06/11 PHP
PHP面向对象程序设计重载(overloading)操作详解
2019/06/13 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
2020/02/21 PHP
JavaScript sub方法入门实例(把字符串显示为下标)
2014/10/17 Javascript
javascript实现倒计时N秒后网页自动跳转代码
2014/12/11 Javascript
js实现拉幕效果的广告代码
2015/09/02 Javascript
纯JS实现轮播图
2017/02/22 Javascript
微信小程序 页面跳转如何实现传值
2017/04/05 Javascript
ES6新特性五:Set与Map的数据结构实例分析
2017/04/21 Javascript
JS实现合并json对象的方法
2017/10/10 Javascript
js解决软键盘遮挡输入框的问题分享
2017/12/19 Javascript
Vue项目实现换肤功能的一种方案分析
2019/08/28 Javascript
详解微信小程序中var、let、const用法与区别
2020/01/11 Javascript
Vue左滑组件slider使用详解
2020/08/21 Javascript
JSON 入门教程基础篇 json入门学习笔记
2020/09/22 Javascript
在python的WEB框架Flask中使用多个配置文件的解决方法
2014/04/18 Python
python中argparse模块用法实例详解
2015/06/03 Python
TensorFlow实现AutoEncoder自编码器
2018/03/09 Python
python3处理含有中文的url方法
2018/05/10 Python
PyCharm代码格式调整方法
2018/05/23 Python
详解python编译器和解释器的区别
2019/06/24 Python
python数据归一化及三种方法详解
2019/08/06 Python
django-filter和普通查询的例子
2019/08/12 Python
python变量的作用域是什么
2020/05/26 Python
解决Pycharm 运行后没有输出的问题
2021/02/05 Python
利用Node实现HTML5离线存储的方法
2020/10/16 HTML / CSS
size?爱尔兰官方网站:英国伦敦的球鞋精品店
2019/03/31 全球购物
巴西箱包、背包、钱包和旅行配件购物网站:Inovathi
2019/12/14 全球购物
中学生自我鉴定
2014/02/04 职场文书
高三毕业典礼演讲稿
2014/05/13 职场文书
2014高考励志标语
2014/06/05 职场文书
PyTorch 如何检查模型梯度是否可导
2021/06/05 Python
MySQL 中如何归档数据的实现方法
2022/03/16 SQL Server
Python FuzzyWuzzy实现模糊匹配
2022/04/28 Python
Redis批量生成数据的实现
2022/06/05 Redis