浅谈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 相关文章推荐
多浏览器支持的右下角浮动窗口
Apr 01 Javascript
javascript笔记 String类replace函数的一些事
Sep 22 Javascript
JS的document.all函数使用示例
Dec 30 Javascript
全面解析JavaScript中“&&”和“||”操作符(总结篇)
Jul 18 Javascript
SeaJS中use函数用法实例分析
Oct 10 Javascript
关于Vue单页面骨架屏实践记录
Dec 13 Javascript
ztree加载完成后显示勾选节点的实现代码
Oct 22 Javascript
详解vue中axios的使用与封装
Mar 20 Javascript
JavaScript实现的开关灯泡点击切换特效示例
Jul 08 Javascript
javascript实现图片轮播代码
Jul 09 Javascript
使用konva和vue-konva库实现拖拽滑块验证功能
Apr 27 Javascript
vue-router为激活的路由设置样式操作
Jul 18 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使用PHPMailer发送邮件的简单使用方法
2013/11/12 PHP
PHP钩子与简单分发方式实例分析
2017/09/04 PHP
php从数据库中获取数据用ajax传送到前台的方法
2018/08/20 PHP
PHP封装cURL工具类与应用示例
2019/07/01 PHP
jquery api参考 visualjquery 中国线路 速度快
2007/11/30 Javascript
jquery 注意事项与常用语法小结
2010/06/07 Javascript
jquery获取下拉列表的值为null的解决方法
2011/03/18 Javascript
js+div实现图片滚动效果代码
2014/02/10 Javascript
JavaScript获取某年某月的最后一天附截图
2014/06/23 Javascript
jQuery中delegate()方法的用法详解
2016/10/13 Javascript
浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)
2017/11/10 Javascript
详解vuex中action何时完成以及如何正确调用dispatch的思考
2019/01/21 Javascript
node+multer实现图片上传的示例代码
2020/02/18 Javascript
javascript设计模式 ? 简单工厂模式原理与应用实例分析
2020/04/09 Javascript
Vue 实现可视化拖拽页面编辑器
2021/02/01 Vue.js
[01:13]这,就是刀塔
2014/07/16 DOTA
在Python中使用HTML模版的教程
2015/04/29 Python
深入讲解Python中面向对象编程的相关知识
2015/05/25 Python
python 的列表遍历删除实现代码
2020/04/12 Python
Python模拟百度登录实例详解
2016/01/20 Python
Python实现对象转换为xml的方法示例
2017/06/08 Python
python 定义n个变量方法 (变量声明自动化)
2018/11/10 Python
详解python持久化文件读写
2019/04/06 Python
详解从Django Allauth中进行登录改造小结
2019/12/18 Python
Python实现银行账户资金交易管理系统
2020/01/03 Python
使用Python Tkinter实现剪刀石头布小游戏功能
2020/10/23 Python
基于Python实现粒子滤波效果
2020/12/01 Python
Alba Moda瑞士网上商店:独家意大利时尚女装销售
2016/11/28 全球购物
Python如何实现单例模式
2016/06/03 面试题
机电一体化毕业生求职信
2013/11/02 职场文书
电教室标语
2014/06/20 职场文书
致800米运动员广播稿(10篇)
2014/10/17 职场文书
三峡大坝导游词
2015/01/31 职场文书
2015年志愿者服务工作总结
2015/04/20 职场文书
2016社区平安家庭事迹材料
2016/02/26 职场文书
Python Matplotlib绘制条形图的全过程
2021/10/24 Python