浅谈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 相关文章推荐
Mootools 1.2教程(3) 数组使用简介
Sep 14 Javascript
验证码按回车不变解决方法
Mar 29 Javascript
js实例属性和原型属性示例详解
Nov 23 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
Dec 08 Javascript
jQuery对象的length属性用法实例
Dec 27 Javascript
微信小程序 保留小数(toFixed)详细介绍
Nov 16 Javascript
jQuery实现判断控件是否显示的方法
Jan 11 Javascript
Easyui Tree获取当前选择节点的所有顶级父节点
Feb 14 Javascript
webpack+react+antd脚手架优化的方法
Apr 02 Javascript
js数据类型检测总结
Aug 05 Javascript
详解在vue-test-utils中mock全局对象
Nov 07 Javascript
小程序自定义圆形进度条
Nov 17 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+javascript制作带提示的验证码源码分享
2014/05/28 PHP
php中switch与ifelse的效率区别及适用情况分析
2015/02/12 PHP
PHP实现指定字段的多维数组排序函数分享
2015/03/09 PHP
php+MySQL实现登录时验证登录名和密码是否正确
2016/05/10 PHP
Yii2基于Ajax自动获取表单数据的方法
2016/08/10 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
提高 DHTML 页面性能
2006/12/25 Javascript
JQuery从头学起第三讲
2010/07/06 Javascript
Javascript中神奇的this
2016/01/20 Javascript
微信小程序之小豆瓣图书实例
2016/11/30 Javascript
JS+DIV实现的卷帘效果示例
2017/03/22 Javascript
浅谈Webpack核心模块tapable解析
2018/09/11 Javascript
微信小程序通过js实现瀑布流布局详解
2019/08/28 Javascript
layui实现根据table数据判断按钮显示情况的方法
2019/09/26 Javascript
jQuery实现二级导航菜单的示例
2020/09/30 jQuery
Python实现E-Mail收集插件实例教程
2019/02/06 Python
Python 编程速成(推荐)
2019/04/15 Python
使用python实现简单五子棋游戏
2019/06/18 Python
Python API自动化框架总结
2019/11/12 Python
Python类继承和多态原理解析
2020/02/05 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
2020/05/13 Python
Python基于pip实现离线打包过程详解
2020/05/15 Python
python更新数据库中某个字段的数据(方法详解)
2020/11/18 Python
澳大利亚吉他在线:Artist Guitars
2017/03/30 全球购物
大学生求职中的自我评价
2013/10/01 职场文书
煤矿班组长的职责
2013/12/25 职场文书
企业内部培训方案
2014/02/04 职场文书
大学生毕业求职自荐书范文
2014/02/04 职场文书
技能比赛获奖感言
2014/02/14 职场文书
机电职业生涯规划书范文
2014/03/08 职场文书
2014年终工作总结范本
2014/12/15 职场文书
工作保证书怎么写
2015/02/28 职场文书
WebRTC记录音视频流(web技术分享)
2022/02/24 Javascript
Java9新特性之Module模块化编程示例演绎
2022/03/16 Java/Android
CSS子盒子水平和垂直居中的五种方法
2022/07/23 HTML / CSS