详解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 相关文章推荐
创建一个复制UBB软件信息的链接或按钮的js代码
Jan 06 Javascript
javascript 二维数组的实现与应用
Mar 16 Javascript
JS自动缩小超出大小的图片
Oct 12 Javascript
动态读取JSON解析键值对的方法
Jun 03 Javascript
JS简单限制textarea内输入字符数量的方法
Oct 14 Javascript
js事件源window.event.srcElement兼容性写法(详解)
Nov 25 Javascript
bootstrap模态框远程示例代码分享
May 22 Javascript
js禁止Backspace键使浏览器后退的实现方法
Sep 01 Javascript
elemetUi 组件--el-upload实现上传Excel文件的实例
Oct 27 Javascript
浅析Vue 生命周期
Jun 21 Javascript
iView-admin 动态路由问题的解决方法
Oct 03 Javascript
JS相册图片抖动放大展示效果的示例代码
Jan 29 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 eval()函数定义和用法
2016/06/21 PHP
php中10个不同等级压缩优化图片操作示例
2016/11/14 PHP
另类调用flash无须激活的方法
2006/12/27 Javascript
javascript 禁止复制网页
2009/06/11 Javascript
JavaScript对象创建及继承原理实例解剖
2013/02/28 Javascript
Jquery实现控件的隐藏和显示实例
2014/02/08 Javascript
js实现Form栏显示全格式时间时钟效果代码
2015/08/19 Javascript
js仿支付宝填写支付密码效果实现多方框输入密码
2016/03/09 Javascript
关于jQuery里prev()的简单操作代码
2017/10/27 jQuery
AngularJS使用ng-repeat遍历二维数组元素的方法详解
2017/11/11 Javascript
vue2过滤器模糊查询方法
2018/09/16 Javascript
angularJs中json数据转换与本地存储的实例
2018/10/08 Javascript
详解vuex 渐进式教程实例代码
2018/11/27 Javascript
js实现ATM机存取款功能
2020/10/27 Javascript
微信jssdk踩坑之签名错误invalid signature
2020/05/19 Javascript
vue中使用echarts的示例
2021/01/03 Vue.js
python3写爬取B站视频弹幕功能
2017/12/22 Python
解决Python2.7中IDLE启动没有反应的问题
2018/11/30 Python
Ubuntu下Anaconda和Pycharm配置方法详解
2019/06/14 Python
Python类反射机制使用实例解析
2019/12/30 Python
canvas绘制表情包的示例代码
2018/07/09 HTML / CSS
数据库基础的一些面试题
2012/02/25 面试题
求职者应聘的自我评价
2013/10/16 职场文书
写自荐信要注意什么
2013/12/26 职场文书
办理居住证介绍信
2014/01/15 职场文书
八年级美术教学反思
2014/02/02 职场文书
办公室员工岗位工作职责
2014/03/10 职场文书
全国文明单位申报材料
2014/05/31 职场文书
三好生演讲稿
2014/09/12 职场文书
群众路线领导班子四风对照检查材料
2014/09/27 职场文书
离婚协议书怎么写2014
2014/09/30 职场文书
有限责任公司股东合作协议书范本
2014/10/30 职场文书
工人先锋号申报材料
2014/12/29 职场文书
志愿者个人总结
2015/03/03 职场文书
2015年组织部工作总结
2015/04/03 职场文书
黄埔军校观后感
2015/06/10 职场文书