详解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 相关文章推荐
JS实现浏览器菜单命令
Sep 05 Javascript
jQuery学习笔记 操作jQuery对象 属性处理
Sep 19 Javascript
js异常捕获方法介绍
Apr 10 Javascript
JavaScript异步编程:异步数据收集的具体方法
Aug 19 Javascript
js解决弹窗问题实现班级跳转DIV示例
Jan 06 Javascript
js使用html()或text()方法获取设置p标签的显示的值
Aug 01 Javascript
js判断鼠标左、中、右键哪个被点击的方法
Jan 27 Javascript
使用AngularJS中的SCE来防止XSS攻击的方法
Jun 18 Javascript
微信小程序 参数传递详解
Oct 24 Javascript
使用canvas实现一个vue弹幕组件功能
Nov 30 Javascript
vue项目中引入Sass实例方法
Aug 27 Javascript
JS+HTML5本地存储Localstorage实现注册登录及验证功能示例
Feb 10 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中配置文件现在需要绝密的短语密码的解决方法
2007/02/11 PHP
PHP访问MYSQL数据库封装类(附函数说明)
2010/12/04 PHP
PHP连接SQLSERVER 注意事项(附dll文件下载)
2012/06/28 PHP
php对二维数组进行排序的简单实例
2013/12/19 PHP
php实现zip文件解压操作
2015/11/03 PHP
php导出生成word的方法
2015/12/25 PHP
php pdo操作数据库示例
2017/03/10 PHP
Prototype使用指南之enumerable.js
2007/01/10 Javascript
一个封装js代码-----展开收起效果示例
2013/07/03 Javascript
jquery实现输入框动态增减的实例代码
2013/07/14 Javascript
js简单网速测试方法完整实例
2015/12/15 Javascript
jQuery表格插件datatables用法汇总
2016/03/29 Javascript
新入门node.js必须要知道的概念(必看篇)
2016/08/10 Javascript
基于node.js制作简单爬虫教程
2017/06/29 Javascript
详解Nodejs mongoose
2018/06/10 NodeJs
微信小程序之自定义组件的实现代码(附源码)
2018/08/02 Javascript
vue elementUI table 自定义表头和行合并的实例代码
2019/05/22 Javascript
vue-cli脚手架引入弹出层layer插件的几种方法
2019/06/24 Javascript
el-select 下拉框多选实现全选的实现
2019/08/02 Javascript
小程序实现按下录音松开识别语音
2019/11/22 Javascript
微信小程序自定义弹出层效果
2020/05/26 Javascript
一份python入门应该看的学习资料
2018/04/11 Python
python3+PyQt5实现自定义流体混合窗口部件
2018/04/24 Python
python3+selenium实现qq邮箱登陆并发送邮件功能
2019/01/23 Python
Python类中方法getitem和getattr详解
2019/08/30 Python
python实现从尾到头打印单链表操作示例
2020/02/22 Python
医学专业毕业生个人的求职信
2013/12/04 职场文书
三好学生自我鉴定
2013/12/17 职场文书
《唯一的听众》教学反思
2014/02/20 职场文书
食品采购员岗位职责
2014/04/14 职场文书
村支部书记群众路线对照检查材料思想汇报
2014/10/08 职场文书
寒山寺导游词
2015/02/03 职场文书
2015年煤矿工作总结
2015/04/28 职场文书
浅谈GO中的Channel以及死锁的造成
2022/03/18 Golang
python通过新建环境安装tfx的问题
2022/05/20 Python
浅谈音视频 pts dts基本概念及理解
2022/08/05 数码科技