详解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 相关文章推荐
Chrome中模态对话框showModalDialog返回值问题的解决方法
May 25 Javascript
js关闭模态窗口刷新父页面或跳转页面
Dec 13 Javascript
js中方法重载如何实现?以及函数的参数问题
Aug 01 Javascript
JS中产生标识符方式的演变
Jun 12 Javascript
jQuery中inArray方法注意事项分析
Jan 25 Javascript
JavaScript数组合并的多种方法
May 22 Javascript
jQuery 判断元素整理汇总
Feb 28 Javascript
Angular.js中$resource高大上的数据交互详解
Jul 30 Javascript
20个最常见的jQuery面试问题及答案
May 23 jQuery
一份超级详细的Vue-cli3.0使用教程【推荐】
Nov 15 Javascript
原生JS实现列表内容自动向上滚动效果
May 22 Javascript
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
Aug 01 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 截取字符串 分别适合GB2312和UTF8编码情况
2009/02/12 PHP
PHP内核探索:变量存储与类型使用说明
2014/01/30 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
2014/05/08 PHP
php简单统计字符串单词数量的方法
2015/06/19 PHP
PHP学习笔记之php文件操作
2016/06/03 PHP
PHP实现Huffman编码/解码的示例代码
2018/04/20 PHP
thinkphp5.1框架容器与依赖注入实例分析
2019/07/23 PHP
搭建PhpStorm+PhpStudy开发环境的超详细教程
2020/09/17 PHP
Gird事件机制初级读本
2007/03/10 Javascript
在textarea中显示html页面的javascript代码
2007/04/20 Javascript
父页面显示遮罩层弹出半透明状态的dialog
2014/03/04 Javascript
c#+jquery实现获取radio和checkbox的值
2020/09/12 Javascript
基于Jquery实现仿百度百科右侧导航代码附源码下载
2015/11/27 Javascript
localStorage实现便签小程序
2016/11/28 Javascript
详解如何较好的使用js
2016/12/16 Javascript
jquery动态赋值id与动态取id方法示例
2017/08/21 jQuery
详解tween.js的使用教程
2017/09/14 Javascript
微信小程序使用form表单获取输入框数据的实例代码
2018/05/17 Javascript
简单说说angular.json文件的使用
2018/10/29 Javascript
Vue注册组件命名时不能用大写的原因浅析
2019/04/25 Javascript
JS 创建对象的模式实例小结
2020/04/28 Javascript
Python深入学习之装饰器
2014/08/31 Python
python实现二维码扫码自动登录淘宝
2016/12/27 Python
使用PM2+nginx部署python项目的方法示例
2018/11/07 Python
python 非线性规划方式(scipy.optimize.minimize)
2020/02/11 Python
Iconfont(矢量图标)+iconmoon(图标svg互转)配合javascript实现社交分享系统
2020/04/21 Python
Python中pass的作用与使用教程
2020/11/13 Python
优秀英语专业毕业生求职信
2013/11/23 职场文书
2014三八妇女节活动总结范文四篇
2014/03/09 职场文书
学生检讨书范文
2014/10/30 职场文书
2014年医院后勤工作总结
2014/12/06 职场文书
2015年度学校卫生工作总结
2015/05/12 职场文书
网聊搭讪开场白
2015/05/28 职场文书
幼儿园小班教育随笔
2015/08/14 职场文书
详解MySQL 用户权限管理
2021/04/20 MySQL
python百行代码实现汉服圈图片爬取
2021/11/23 Python