详解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 相关文章推荐
javascript动画之圆形运动,环绕鼠标运动作小球
Jul 20 Javascript
js淡入淡出焦点图幻灯片效果代码分享
Sep 08 Javascript
JavaScript+html5 canvas制作的圆中圆效果实例
Jan 27 Javascript
JS中改变this指向的方法(call和apply、bind)
Mar 26 Javascript
ES6新特征数字、数组、字符串
Oct 01 Javascript
JavaScript中三个等号和两个等号你了解多少
Jul 04 Javascript
echarts学习笔记之图表自适应问题详解
Nov 22 Javascript
在Vue中使用echarts的方法
Feb 05 Javascript
Angular刷新当前页面的实现方法
Nov 21 Javascript
Angular4.0动画操作实例详解
May 10 Javascript
vue全屏事件开发详解
Jun 17 Javascript
关于javascript中的promise的用法和注意事项(推荐)
Jan 15 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
解决phpmyadmin 乱码,支持gb2312和utf-8
2006/11/20 PHP
PHP统计目录大小的自定义函数分享
2014/11/18 PHP
php处理单文件、多文件上传代码分享
2016/08/24 PHP
CI(CodeIgniter)框架中URL特殊字符处理与SQL注入隐患分析
2019/02/28 PHP
[全兼容哦]--实用、简洁、炫酷的页面转入效果loing
2007/05/07 Javascript
动态刷新 dorado树的js代码
2009/06/12 Javascript
JS无限树状列表实现代码
2011/01/11 Javascript
JS/FLASH实现复制代码到剪贴板(兼容所有浏览器)
2013/05/27 Javascript
12行javascript代码绘制一个八卦图
2015/04/02 Javascript
javascript异步处理工作机制详解
2015/04/13 Javascript
JQuery中Text方法用法实例分析
2015/05/18 Javascript
jQuery复制表单元素附源码分享效果演示
2015/09/30 Javascript
基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)
2015/12/29 Javascript
JS正则截取两个字符串之间及字符串前后内容的方法
2017/01/06 Javascript
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
VUE页面中加载外部HTML的示例代码
2017/09/20 Javascript
tweenjs缓动算法的使用实例分析
2019/08/26 Javascript
Python 解决中文写入Excel时抛异常的问题
2018/05/03 Python
python异步存储数据详解
2019/03/19 Python
浅谈Python爬虫基本套路
2019/03/25 Python
python实现视频分帧效果
2019/05/31 Python
如何在Django配置文件里配置session链接
2019/08/06 Python
python自动化实现登录获取图片验证码功能
2019/11/20 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
2020/01/18 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
2020/02/11 Python
Python猜数字算法题详解
2020/03/01 Python
Python 实现打印单词的菱形字符图案
2020/04/12 Python
Python Dict找出value大于某值或key大于某值的所有项方式
2020/06/05 Python
HTML5 video进入全屏和退出全屏的实现方法
2020/07/28 HTML / CSS
英国最好的包装供应商:Priory Direct
2019/12/17 全球购物
光荣入党自我鉴定
2014/01/22 职场文书
房屋买卖委托书格式范本格式
2014/10/13 职场文书
原生JS中应该禁止出现的写法
2021/05/05 Javascript
Goland使用Go Modules创建/管理项目的操作
2021/05/06 Golang
使用RedisTemplat实现简单的分布式锁
2021/11/20 Redis
mysql下的max_allowed_packet参数设置详解
2022/02/12 MySQL