浅谈angular.js跨域post解决方案


Posted in Javascript onAugust 30, 2017

跨域,前端开发中经常遇到的问题,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;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery AJAX回调函数this指向问题
Feb 08 Javascript
自己写的Javascript计算时间差函数
Oct 28 Javascript
整理的比较全的event对像在ie与firefox浏览器中的区别
Nov 25 Javascript
js关于精确计算和数值格式化以及直接引js文件
Jan 28 Javascript
javascript中的return和闭包函数浅析
Jun 06 Javascript
超详细的javascript数组方法汇总
Nov 21 Javascript
Three.js的使用及绘制基础3D图形详解
Apr 27 Javascript
SVG动画vivus.js库使用小结(实例代码)
Sep 14 Javascript
vue计算属性及使用详解
Apr 02 Javascript
jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】
Aug 28 jQuery
vue项目打包部署_nginx代理访问方法详解
Sep 20 Javascript
vue实现日历备忘录功能
Sep 24 Javascript
详解a++和++a的区别
Aug 30 #Javascript
详解vue2.0 使用动态组件实现 Tab 标签页切换效果(vue-cli)
Aug 30 #Javascript
angular4 如何在全局设置路由跳转动画的方法
Aug 30 #Javascript
浅谈Vue.js应用的四种AJAX请求数据模式
Aug 30 #Javascript
如何理解Vue的render函数的具体用法
Aug 30 #Javascript
微信小程序之发送短信倒计时功能
Aug 30 #Javascript
使用node.js对音视频文件加密的实例代码
Aug 30 #Javascript
You might like
解析PHP中的unset究竟会不会释放内存
2013/07/18 PHP
PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠
2015/09/30 PHP
php curl中gzip的压缩性能测试实例分析
2016/11/08 PHP
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
Javascript中的isNaN函数使用说明
2011/11/10 Javascript
js的匿名函数使用介绍
2013/12/11 Javascript
raphael.js绘制中国地图 地图绘制方法
2014/02/12 Javascript
JavaScript里四舍五入函数round用法实例
2015/04/06 Javascript
JavaScript实现数组在指定位置插入若干元素的方法
2015/04/06 Javascript
jquery插件jquery.LightBox.js实现点击放大图片并左右点击切换效果(附demo源码下载)
2016/02/25 Javascript
jQuery检查元素存在性(推荐)
2016/09/17 Javascript
JS自定义函数对web前端上传的文件进行类型大小判断
2016/10/19 Javascript
js遍历json的key和value的实例
2017/01/22 Javascript
jQuery实现验证码功能
2017/03/17 Javascript
通过vue写一个瀑布流插件代码实例
2019/09/07 Javascript
JS call()及apply()方法使用实例汇总
2020/07/11 Javascript
Python查看多台服务器进程的脚本分享
2014/06/11 Python
Python中input与raw_input 之间的比较
2017/08/20 Python
python+PyQT实现系统桌面时钟
2020/06/16 Python
使用python list 查找所有匹配元素的位置实例
2019/06/11 Python
python区块及区块链的开发详解
2019/07/03 Python
python读取.mat文件的数据及实例代码
2019/07/12 Python
使用python实现男神女神颜值打分系统(推荐)
2019/10/31 Python
Python 安装 virturalenv 虚拟环境的教程详解
2020/02/21 Python
Django认证系统user对象实现过程解析
2020/03/02 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
2020/08/04 Python
HTML5 LocalStorage 本地存储刷新值还在
2017/03/10 HTML / CSS
Born鞋子官网:Born Shoes
2017/04/06 全球购物
伦敦一卡通:The London Pass
2018/11/30 全球购物
保加利亚运动鞋购物网站:SneakerStudio.bg
2020/12/23 全球购物
Java TransactionAPI (JTA) 主要包含几部分
2012/12/07 面试题
活动总结范文
2014/08/30 职场文书
2014年小学德育工作总结
2014/12/05 职场文书
Python爬虫网络请求之代理服务器和动态Cookies
2022/04/12 Python
Smart 2 车辆代号 HC11 全新谍照曝光
2022/04/21 数码科技
Python使用openpyxl模块处理Excel文件
2022/06/05 Python