详解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 相关文章推荐
关于实现代码语法标亮 dp.SyntaxHighlighter
Feb 02 Javascript
JavaScript高级程序设计(第3版)学习笔记 概述
Oct 11 Javascript
js通过地址栏给action传值(中文乱码全是问号)
May 02 Javascript
jQery使网页在显示器上居中显示适用于任何分辨率
Jun 09 Javascript
JS实现点击颜色块切换指定区域背景颜色的方法
Feb 25 Javascript
jQuery实现简单的文件上传进度条效果
Mar 26 Javascript
Vuex之理解Mutations的用法实例
Apr 19 Javascript
js导出Excel表格超出26位英文字符的解决方法ES6
Nov 15 Javascript
Webpack实战加载SVG的方法
Dec 26 Javascript
解决Angular.js中使用Swiper插件不能滑动的问题
Feb 26 Javascript
vue中实现高德定位功能
Dec 03 Javascript
微信小程序实现自定义底部导航
Nov 18 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 7安装使用体验之性能大提升,兼容性强,扩展支持不够(升级PHP要谨慎)
2017/07/27 PHP
php实现websocket实时消息推送
2018/03/30 PHP
javascript一些不错的函数脚本代码
2008/09/10 Javascript
jquery插件开发注意事项小结
2013/06/04 Javascript
javascript表单验证使用示例(javascript验证邮箱)
2014/01/07 Javascript
JS获取文本框,下拉框,单选框的值的简单实例
2014/02/26 Javascript
JavaScript中的数组操作介绍
2014/12/30 Javascript
jQuery获取URL请求参数的方法
2015/07/18 Javascript
bootstrap-treeview自定义双击事件实现方法
2016/01/09 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
2016/06/03 Javascript
JS获取短信验证码倒计时的实现代码
2017/05/22 Javascript
浅谈ajax在jquery中的请求和servlet中的响应
2018/01/22 jQuery
JS设计模式之状态模式概念与用法分析
2018/02/05 Javascript
Vue press 支持图片放大功能的实例代码
2018/11/09 Javascript
vue的三种图片引入方式代码实例
2019/11/19 Javascript
Python-基础-入门 简介
2014/08/09 Python
Python实现嵌套列表去重方法示例
2017/12/28 Python
numpy中的delete删除数组整行和整列的实例
2018/05/09 Python
PyCharm代码提示忽略大小写设置方法
2018/10/28 Python
python dataframe向下向上填充,fillna和ffill的方法
2018/11/28 Python
Python设计模式之简单工厂模式实例详解
2019/01/22 Python
PythonWeb项目Django部署在Ubuntu18.04腾讯云主机上
2019/04/01 Python
pytz格式化北京时间多出6分钟问题的解决方法
2019/06/21 Python
Python接口自动化判断元素原理解析
2020/02/24 Python
python能做哪方面的工作
2020/06/15 Python
如何卸载python插件
2020/07/08 Python
浅谈如何使用python抓取网页中的动态数据实现
2020/08/17 Python
python时间time模块处理大全
2020/10/25 Python
Python中的面向接口编程示例详解
2021/01/17 Python
HTML5 Canvas绘制文本及图片的基础教程
2016/03/14 HTML / CSS
自荐信模版
2013/10/24 职场文书
酒店总经理欢迎词
2014/01/15 职场文书
2014县委书记四风对照检查材料思想汇报
2014/09/21 职场文书
博物馆观后感
2015/06/05 职场文书
2016七一建党节慰问信
2015/11/30 职场文书
java如何实现获取客户端ip地址的示例代码
2022/04/07 Java/Android