浅谈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 相关文章推荐
在JavaScript里嵌入大量字符串常量的实现方法
Jul 07 Javascript
AngularJs基本特性解析(一)
Jul 21 Javascript
JS实现自动阅读单词(有道单词本添加功能)
Nov 14 Javascript
全面总结Javascript对数组对象的各种操作
Jan 22 Javascript
Bootstrap学习笔记 轮播(Carousel)插件
Mar 21 Javascript
JavaScript实现三级联动效果
Jul 15 Javascript
select获取下拉框的值 下拉框默认选中方法
Feb 28 Javascript
微信小程序发送短信验证码完整实例
Jan 07 Javascript
总结4个方面优化Vue项目
Feb 11 Javascript
使用element-ui table expand展开行实现手风琴效果
Mar 15 Javascript
如何在Node和浏览器控制台中打印彩色文字
Jan 09 Javascript
vue配置多代理服务接口地址操作
Sep 08 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根据生日计算年龄的方法
2015/07/13 PHP
js操作ajax返回的json的注意问题!
2010/02/23 Javascript
JavaScript中的prototype使用说明
2010/04/13 Javascript
JS获取各种浏览器窗口大小的方法
2014/01/14 Javascript
js实现右下角提示框的方法
2015/02/03 Javascript
JavaScript实现找质数代码分享
2015/03/24 Javascript
javascript将DOM节点添加到文档的方法实例分析
2015/08/04 Javascript
微信小程序scroll-view实现横向滚动和上拉加载示例
2017/03/06 Javascript
lhgcalendar时间插件限制只能选择三个月的实现方法
2017/07/03 Javascript
JS中call和apply函数用法实例分析
2018/06/20 Javascript
js删除数组中某几项的方法总结
2019/01/16 Javascript
在vue项目中引入vue-beauty操作方法
2019/02/11 Javascript
nodejs实现获取本地文件夹下图片信息功能示例
2019/06/22 NodeJs
小程序实现短信登录倒计时
2019/07/12 Javascript
js实现图片实时时钟
2020/01/15 Javascript
详解ES6数组方法find()、findIndex()的总结
2020/05/12 Javascript
[00:35]DOTA2上海特级锦标赛 VP战队宣传片
2016/03/04 DOTA
[59:44]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 paiN vs iG
2018/03/31 DOTA
wxpython 学习笔记 第一天
2009/03/16 Python
python logging日志模块的详解
2017/10/29 Python
python实现二叉树的遍历
2017/12/11 Python
DataFrame:通过SparkSql将scala类转为DataFrame的方法
2019/01/29 Python
Python 中包/模块的 `import` 操作代码
2019/04/22 Python
Pytorch之保存读取模型实例
2019/12/30 Python
python爬虫中PhantomJS加载页面的实例方法
2020/11/12 Python
日语专业毕业生求职信
2013/12/04 职场文书
自我评价如何写好?
2014/01/05 职场文书
生日寿宴答谢词
2014/01/19 职场文书
不打扫卫生检讨书
2014/02/12 职场文书
求职意向书范文
2014/04/01 职场文书
大学生就业策划书范文
2014/04/04 职场文书
2014年全国法制宣传日宣传活动方案
2014/11/02 职场文书
工厂采购员岗位职责
2015/04/07 职场文书
刑事上诉状(量刑过重)
2015/05/23 职场文书
2016年清明节寄语
2015/12/04 职场文书
《异世界四重奏》剧场版6月10日上映 PV视觉图原创角色发表
2022/03/20 日漫