浅谈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的$(document).ready()和onload的加载顺序
May 26 Javascript
js控制CSS样式属性语法对照表
Dec 11 Javascript
JS 各种网页尺寸判断实例方法
Apr 18 Javascript
js的Boolean对象初始值示例
Mar 04 Javascript
JavaScript中的逻辑判断符&&、||与!介绍
Dec 31 Javascript
使用javascript实现json数据以csv格式下载
Jan 09 Javascript
javascript判断css3动画结束 css3动画结束的回调函数
Mar 10 Javascript
JavaScript控制网页层收起和展开效果的方法
Apr 15 Javascript
JS实现队列与堆栈的方法
Apr 21 Javascript
详解三种方式解决vue中v-html元素中标签样式
Nov 22 Javascript
详解Vue一个案例引发「内容分发slot」的最全总结
Dec 02 Javascript
vue 子组件和父组件传值的示例
Sep 11 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代码(抓取网页中的邮箱地址)
2012/07/17 PHP
php+js实现图片的上传、裁剪、预览、提交示例
2013/08/27 PHP
php获取远程图片并下载保存到本地的方法分析
2016/10/08 PHP
Jquery的Tabs内容轮换效果实现代码,几行搞定
2014/02/12 Javascript
使用GruntJS构建Web程序之构建篇
2014/06/04 Javascript
javascript使用shift+click实现选择和反选checkbox的方法
2015/05/04 Javascript
深入理解Javascript中的自执行匿名函数
2016/06/03 Javascript
bootstrap输入框组使用方法
2017/02/07 Javascript
JavaScript正则获取地址栏中参数的方法
2017/03/02 Javascript
Angular表格神器ui-grid应用详解
2017/09/29 Javascript
去掉vue 中的代码规范检测两种方法(Eslint验证)
2018/03/21 Javascript
vue插件开发之使用pdf.js实现手机端在线预览pdf文档的方法
2018/07/12 Javascript
原生JS实现动态添加新元素、删除元素方法
2019/05/05 Javascript
利用Angular7开发一个Radio组件的全过程
2019/07/11 Javascript
d3.js实现图形拖拽
2019/12/19 Javascript
微信小程序吸底区域适配iPhoneX的实现
2020/04/09 Javascript
javascript设计模式 ? 代理模式原理与用法实例分析
2020/04/16 Javascript
python使用PyV8执行javascript代码示例分享
2013/12/04 Python
Python中tell()方法的使用详解
2015/05/24 Python
Python黑魔法@property装饰器的使用技巧解析
2016/06/16 Python
Python抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地
2018/02/23 Python
Flask框架请求钩子与request请求对象用法实例分析
2019/11/07 Python
Python接口测试get请求过程详解
2020/02/28 Python
如何通过命令行进入python
2020/07/06 Python
事业单位接收函
2014/01/10 职场文书
高一物理教学反思
2014/01/24 职场文书
公司董事长岗位职责
2014/06/08 职场文书
建筑学专业自荐书
2014/07/09 职场文书
食品安全承诺书范文
2014/08/29 职场文书
党员年终个人总结
2015/02/14 职场文书
中学生逃课检讨书
2015/02/17 职场文书
幼儿园大班个人总结
2015/02/28 职场文书
出纳试用期自我评价
2015/03/10 职场文书
追讨欠款律师函
2015/06/24 职场文书
React四级菜单的实现
2022/04/08 Javascript
苹果macOS 13开发者预览版Beta 8发布 正式版10月发布
2022/09/23 数码科技