浅谈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中的new的使用方法与注意事项
May 16 Javascript
jQuery 页面载入进度条实现代码
Feb 08 Javascript
JS删除数组元素的函数介绍
Mar 27 Javascript
javascript递归回溯法解八皇后问题
Apr 22 Javascript
jQuery过滤选择器用法示例
Sep 12 Javascript
jquery Banner轮播选项卡
Dec 26 Javascript
原生Javascript插件开发实践
Jan 09 Javascript
jquery表单验证插件validation使用方法详解
Jan 20 Javascript
react-native 封装选择弹出框示例(试用ios&android)
Jul 11 Javascript
vue router使用query和params传参的使用和区别
Nov 13 Javascript
JS实现json对象数组按对象属性排序操作示例
May 18 Javascript
Jquery高级应用Deferred对象原理及使用实例
May 28 jQuery
详解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 $_ENV为空的原因分析
2009/06/01 PHP
php在多维数组中根据键名快速查询其父键以及父键值的代码
2011/05/07 PHP
php结合安卓客户端实现查询交互实例
2015/05/05 PHP
详解WordPress开发中get_header()获取头部函数的用法
2016/01/08 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
详解Laravel设置多态关系模型别名的方式
2019/10/17 PHP
调用js时ie6和ie7,ff的区别
2009/08/19 Javascript
基于jquery实现后台左侧菜单点击上下滑动显示
2013/04/11 Javascript
js获取IFRAME当前的URL的方法
2013/11/13 Javascript
javascript间隔刷新的简单实例
2013/11/14 Javascript
改变隐藏的input中value值的方法
2014/03/19 Javascript
JS实现的新浪微博大厅文字内容滚动效果代码
2015/11/05 Javascript
移动开发之自适应手机屏幕宽度
2016/11/23 Javascript
js封装成插件_Canvas统计图插件编写实例
2017/09/12 Javascript
详解利用 Express 托管静态文件的方法
2017/09/18 Javascript
Vuex实现计数器以及列表展示效果
2018/03/10 Javascript
简单了解node npm cnpm的具体使用方法
2019/02/27 Javascript
es6函数name属性功能与用法实例分析
2020/04/18 Javascript
全面解析js中的原型,原型对象,原型链
2021/01/25 Javascript
[02:32]DOTA2亚洲邀请赛 VG战队巡礼
2015/02/03 DOTA
[08:53]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS 选手采访
2021/03/11 DOTA
PYTHON正则表达式 re模块使用说明
2011/05/19 Python
python字典DICT类型合并详解
2017/08/17 Python
人机交互程序 python实现人机对话
2017/11/14 Python
Python爬虫实例_城市公交网络站点数据的爬取方法
2018/01/10 Python
浅析python参数的知识点
2018/12/10 Python
python多线程与多进程及其区别详解
2019/08/08 Python
分享PyCharm的几个使用技巧
2019/11/10 Python
Python通过socketserver处理多个链接
2020/03/18 Python
Django CBV模型源码运行流程详解
2020/08/17 Python
Canvas制作旋转的太极的示例
2018/03/09 HTML / CSS
结婚邀请函范文
2014/01/14 职场文书
2015年团队工作总结范文
2015/05/04 职场文书
离婚起诉书范文2015
2015/05/19 职场文书
如何写好活动总结
2019/06/21 职场文书
SpringBoot整合MongoDB的实现步骤
2021/06/23 MongoDB