浅谈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 相关文章推荐
$.format,jquery.format 使用说明
Jul 13 Javascript
Jquery.addClass始终无效原因分析
Sep 08 Javascript
实例讲解JS中数组Array的操作方法
May 09 Javascript
js基于cookie记录来宾姓名的方法
Jul 19 Javascript
js实现上传文件添加和删除文件选择框
Oct 24 Javascript
实例讲解DataTables固定表格宽度(设置横向滚动条)
Jul 11 Javascript
原生JS实现的雪花飘落动画效果
May 03 Javascript
vue-cli3.0配置及使用注意事项详解
Sep 05 Javascript
详解搭建一个vue-cli的移动端H5开发模板
Jan 17 Javascript
vue中jsonp插件的使用方法示例
Sep 10 Javascript
如何在vue中使用百度地图添加自定义覆盖物(水波纹)
Nov 03 Javascript
Node实现搜索框进行模糊查询
Jun 28 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
PHPMailer邮件发送的实现代码
2013/05/04 PHP
php实现随机生成易于记忆的密码
2015/06/19 PHP
php策略模式简单示例分析【区别于工厂模式】
2019/09/25 PHP
jquery实现的超出屏幕时把固定层变为定位层的代码
2010/02/23 Javascript
客户端 使用XML DOM加载json数据的方法
2010/09/28 Javascript
使用Js让Html中特殊字符不被转义
2013/11/05 Javascript
详解JavaScript的while循环的使用
2015/06/03 Javascript
详解JavaScript ES6中的Generator
2015/07/28 Javascript
基于jQuery实现返回顶部实例代码
2016/01/01 Javascript
如何使用Bootstrap的modal组件自定义alert,confirm和modal对话框
2016/03/01 Javascript
jQuery序列化表单成对象的简单实现
2016/11/29 Javascript
Javascript 对cookie操作详解及实例
2016/12/29 Javascript
微信小程序 css使用技巧总结
2017/01/09 Javascript
JS+html5制作简单音乐播放器
2020/09/13 Javascript
xmlplus组件设计系列之网格(DataGrid)(10)
2017/05/05 Javascript
vue2的todolist入门小项目的详细解析
2017/05/11 Javascript
vuejs前后端数据交互之从后端请求数据的实例
2018/08/11 Javascript
微信小程序实现自动定位功能
2018/10/31 Javascript
element-ui表格合并span-method的实现方法
2019/05/21 Javascript
[01:03:50]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第二场 2月7日
2021/03/11 DOTA
python使用webdriver爬取微信公众号
2018/08/31 Python
python 使用pandas计算累积求和的方法
2019/02/08 Python
Python 识别12306图片验证码物品的实现示例
2020/01/20 Python
Python要如何实现列表排序的几种方法
2020/02/21 Python
python读取配置文件方式(ini、yaml、xml)
2020/04/09 Python
python如何构建mock接口服务
2021/01/28 Python
amazeui 验证按钮扩展的实现
2020/08/21 HTML / CSS
沃达丰英国有限公司:Vodafone英国
2019/04/16 全球购物
中专毕业自我鉴定
2013/10/16 职场文书
暑期实践思想汇报
2014/01/06 职场文书
2014领导班子四风问题查摆思想汇报
2014/09/13 职场文书
领导班子四风查摆对照检查材料思想汇报
2014/10/05 职场文书
财政局党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
大学军训心得体会800字
2016/01/11 职场文书
python编程项目中线上问题排查与解决
2021/11/01 Python
Mysql忘记密码解决方法
2022/02/12 MySQL