详解AngularJS如何实现跨域请求


Posted in Javascript onAugust 22, 2016

跨域,前端开发中经常遇到的问题,AngularJS实现跨域方式类似于Ajax,使用CORS机制。

下面阐述一下AngularJS中使用$http实现跨域请求数据。

AngularJS XMLHttpRequest:$http用于读取远程服务器的数据

$http.post(url, data, [config]).success(function(){ ... });
$http.get(url, [config]).success(function(){ ... });
$http.get(url, [config]).success(function(){ ... });

一、$http.jsonp【实现跨域】

1.指定callback和回调函数名,函数名为JSON_CALLBACK时,会调用success回调函数,JSON_CALLBACK必须全为大写。

2.指定其它回调函数,但必须是定义在window下的全局函数。url中必须加上callback

二、$http.get【实现跨域】

1.在服务器端设置允许在其他域名下访问

response.setHeader("Access-Control-Allow-Origin", "*"); //允许所有域名访问
response.setHeader("Access-Control-Allow-Origin", "http://www.123.com"); //允许www.123.com访问

2.AngularJS端使用$http.get()

三、$http.post【实现跨域】

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

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

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

$http.post('http://localhost/ajax/getAllIndustryCategoty.pt',{languageColumn:'name_eu'},{'Content-Type':'application/x-www-form-urlencoded'}).success(function(data){
  $scope.industries = data;
 });

四、实现方式

跨域方式一JSONP】:

方法一:

$http.jsonp("http://localhost/sitesettings/getBadgeInfo.pt?jsonp=JSON_CALLBACK&siteid=137bd406").success(function(data){ ... });
// The name of the callback should be the string JSON_CALLBACK.

方法二【返回值,需要使用对应callback方法接收,但如何置于$scope?】:

$http.jsonp("http://localhost/sitesettings/getBadgeInfo.pt?jsonp=badgeabc&siteid=137bd406");
function badgeabc(data){ ... }

public String execute() throws Exception { 
 String result = FAIL;
 response.setHeader("", "");
 SiteHandlerAction siteHandlerAction = (SiteHandlerAction)BeansFactory.getBean(SiteHandlerAction.class);
 BadgeHandlerAction badgeHandlerAction = (BadgeHandlerAction)BeansFactory.getBean(BadgeHandlerAction.class);
 if("".equals(siteid) || siteid == null || StringUtils.isBlank("jsonp")){
  result = FAIL;
 }else{
  Site site = siteHandlerAction.find(siteid);
  UserBadgeStatus userBadgeStatus = badgeHandlerAction.getUserBadgeStatus(site.getId());
  if(userBadgeStatus != null){
   result = "{\"t\":"+userBadgeStatus.getStyle()+",\"l\":"+userBadgeStatus.getSuspend_location()+",\"s\":"+site.getId()+"}";
   JSONObject jsonObj = JSONObject.fromObject(result);
   String json = jsonObj.toString();
   result = jsonp + "(" + json + ")";
  }
 }
 PrintWriter write = response.getWriter();
 write.print(result);
 write.flush();
 write.close();
 return NONE;
}

跨域方式二$http.get() 】:

function getAdustryController($scope,$http){
 $http.get('http://localhost/ajax/getAllIndustryCategoty.pt?languageColumn=name_eu').success(function(data){
  $scope.industries = data;
 });
}

跨域方式三$http.post()】:

function getAdustryController($scope,$http){
 $http.post('http://localhost/ajax/getAllIndustryCategoty.pt',{languageColumn:'name_eu'},{'Content-Type':'application/x-www-form-urlencoded'}).success(function(data){
  $scope.industries = data;
 });
}

// java端支持跨域请求
public String execute(){
 response.setHeader("Access-Control-Allow-Origin", "*"); //允许哪些url可以跨域请求到本域
 response.setHeader("Access-Control-Allow-Methods","POST"); //允许的请求方法,一般是GET,POST,PUT,DELETE,OPTIONS
 response.setHeader("Access-Control-Allow-Headers","x-requested-with,content-type"); //允许哪些请求头

可以跨域

SiteHandlerAction SiteHandler = (SiteHandlerAction) BeansFactory.getBean(SiteHandlerAction.class);
List list = SiteHandler.getAllIndustryCategory(); //所有的分类集合
JSONArray jsonArray = JSONArray.fromObject(list); //将list转为json
String json = jsonArray.toString(); //转为json字符串
try {
 PrintWriter write = response.getWriter();
 write.print(json);
 write.close();
} catch (IOException e) {
 e.printStackTrace();
}
return NONE;
}

总结

以上就是本文的全部内容,希望本文的内容能对大家学习使用AngularJS有所帮助。

Javascript 相关文章推荐
一段效率很高的for循环语句使用方法
Aug 13 Javascript
Javascript入门学习资料收集整理篇
Jul 06 Javascript
jquery Firefox3.5中操作select的问题
Jul 10 Javascript
JavaScript Event学习补遗 addEventSimple
Feb 11 Javascript
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
Jan 21 Javascript
JavaScript 实现类的多种方法实例
May 01 Javascript
JS使用getComputedStyle()方法获取CSS属性值
Apr 23 Javascript
详解javascript遍历方式
Nov 11 Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
Feb 19 Javascript
AngularJS自定义插件实现网站用户引导功能示例
Nov 07 Javascript
mongoose更新对象的两种方法示例比较
Dec 19 Javascript
Postman如何实现参数化执行及断言处理
Jul 28 Javascript
深入浅析JS Function()构造函数
Aug 22 #Javascript
深入浅析jQuery对象$.html
Aug 22 #Javascript
基于JavaScript实现添加到购物车效果附源码下载
Aug 22 #Javascript
利用原生JS自动生成文章标题树的实例
Aug 22 #Javascript
jQuery使用deferreds串行多个ajax请求
Aug 22 #Javascript
JavaScript代码里的判断小结
Aug 22 #Javascript
angularjs 源码解析之scope
Aug 22 #Javascript
You might like
PHP加速 eAccelerator配置和使用指南
2009/06/05 PHP
php缩放图片(根据宽高的等比例缩放)实例介绍
2013/06/09 PHP
php实现的mysqldb读写分离操作类示例
2017/02/07 PHP
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
2017/04/09 PHP
Javascript在IE和FireFox中的不同表现简析
2012/12/03 Javascript
ECMAScript6中Set/WeakSet详解
2015/06/12 Javascript
AngularJS使用自定义指令替代ng-repeat的方法
2016/09/17 Javascript
Angular在一个页面中使用两个ng-app的方法(二)
2017/02/20 Javascript
基于Node.js模板引擎教程-jade速学与实战1
2017/09/17 Javascript
nodejs实现的连接MySQL数据库功能示例
2018/01/25 NodeJs
angularJS开发注意事项
2018/05/26 Javascript
微信小程序修改swiper默认指示器样式的实例代码
2018/07/18 Javascript
JavaScript+Canvas实现彩色图片转换成黑白图片的方法分析
2018/07/31 Javascript
微信开发之微信jssdk录音功能开发示例
2018/10/22 Javascript
typescript nodejs 依赖注入实现方法代码详解
2019/07/21 NodeJs
NodeJs实现简易WEB上传下载服务器
2019/08/10 NodeJs
微信小程序 简易计算器实现代码实例
2019/09/02 Javascript
vue滚动插件better-scroll使用详解
2019/10/18 Javascript
Vue基于iview实现登录密码的显示与隐藏功能
2020/03/06 Javascript
对pytorch中的梯度更新方法详解
2019/08/20 Python
Python 实现大整数乘法算法的示例代码
2019/09/17 Python
Python Numpy库常见用法入门教程
2020/01/16 Python
使用python实现学生信息管理系统
2021/02/25 Python
美国独家设计师眼镜在线光学商店:Glasses Gallery
2017/12/28 全球购物
理肤泉俄罗斯官网:La Roche-Posay俄罗斯
2018/07/24 全球购物
好矿嫂事迹材料
2014/01/21 职场文书
初中三年毕业生的自我评价分享
2014/02/14 职场文书
求职自荐信怎么写
2014/03/06 职场文书
医学生自我鉴定范文
2014/03/26 职场文书
上课玩手机的检讨书
2014/10/01 职场文书
毕业欢送晚会主持词
2019/06/25 职场文书
python用字节处理文件实例讲解
2021/04/13 Python
JMeter对MySQL数据库进行压力测试的实现步骤
2022/01/22 MySQL
JavaScript的Set数据结构详解
2022/02/18 Javascript
Mysql使用全文索引(FullText index)的实例代码
2022/04/03 MySQL
拙作再改《我的收音机情缘》
2022/04/05 无线电