详解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 相关文章推荐
JQuery 构建客户/服务分离的链接模型中Table分页代码效率初探
Jan 22 Javascript
jquery之超简单的div显示和隐藏特效demo(分享)
Jul 09 Javascript
JS实现动态生成表格并提交表格数据向后端
Nov 25 Javascript
基于JS实现移动端访问PC端页面时跳转到对应的移动端网页
Dec 24 Javascript
网页前端登录js按Enter回车键实现登陆的两种方法
May 10 Javascript
Node.js刷新session过期时间的实现方法推荐
May 18 Javascript
检查表单元素的值是否为空的实例代码
Jun 16 Javascript
使用纯JS代码判断字符串中有多少汉字的实现方法(超简单实用)
Nov 12 Javascript
JS库之wow.js使用方法
Sep 14 Javascript
PHP自动加载autoload和命名空间的应用小结
Dec 01 Javascript
使用FileReader API创建Vue文件阅读器组件
Apr 03 Javascript
vue中使用echarts制作圆环图的实例代码
Jul 27 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判断GIF图片是否为动画的方法
2020/09/04 PHP
PHP正则获取页面所有图片地址
2016/03/23 PHP
如何用javascript判断录入的日期是否合法
2007/01/08 Javascript
网页运行时提示对象不支持abigimage属性或方法
2014/08/10 Javascript
浅析js预加载/延迟加载
2014/09/25 Javascript
javascript查询字符串参数的方法
2015/01/28 Javascript
基于Vuejs框架实现翻页组件
2020/06/29 Javascript
详解微信小程序之一键复制到剪切板
2019/04/24 Javascript
基于vue-cli3+typescript的tsx开发模板搭建过程分享
2020/02/28 Javascript
在vue中对数组值变化的监听与重新响应渲染操作
2020/07/17 Javascript
[10:53]2018DOTA2国际邀请赛寻真——EG
2018/08/11 DOTA
Linux 发邮件磁盘空间监控(python)
2016/04/23 Python
Python实现的朴素贝叶斯分类器示例
2018/01/06 Python
详解如何从TensorFlow的mnist数据集导出手写体数字图片
2019/08/05 Python
python笔记_将循环内容在一行输出的方法
2019/08/08 Python
python将音频进行变速的操作方法
2020/04/08 Python
python线程优先级队列知识点总结
2021/02/28 Python
一款html5 canvas实现的图片玻璃碎片特效
2014/09/11 HTML / CSS
Free People中国官网:波西米亚风格女装服饰
2016/08/30 全球购物
中国包裹转运寄送国际服务:Famiboat
2019/07/24 全球购物
澳大利亚和新西兰最大的在线旅行社之一:Aunt Betty
2019/08/07 全球购物
Cocopanda波兰:购买化妆品、护肤品、护发和香水
2020/05/25 全球购物
Linux如何为某个操作添加别名
2015/02/05 面试题
纺织工程专业个人求职信范文
2014/01/27 职场文书
服务员岗位职责
2014/01/29 职场文书
社区个人对照检查材料(群众路线)
2014/09/26 职场文书
施工安全协议书范本
2014/09/26 职场文书
党支部反对四风思想汇报
2014/10/10 职场文书
工作经验交流材料
2014/12/30 职场文书
意向协议书
2015/01/27 职场文书
2015年暑假生活总结
2015/07/13 职场文书
2016年度师德标兵先进事迹材料
2016/02/26 职场文书
用Python将库打包发布到pypi
2021/04/13 Python
PyTorch的Debug指南
2021/05/07 Python
MySQL数字类型自增的坑
2021/05/07 MySQL
HashMap实现保存两个key相同的数据
2021/06/30 Java/Android