跨域大家都不陌生,但最近一直遇到一个坑,也是自身对ajax和angular的不深入造成,所以记录一笔,下次遇到绕过。

参考过:http://ionichina.com/topic/54f051698cbbaa7a56a49f98,这上面写的很清楚,通过Ionic CLI代理服务器来实现跨域,使用gulp来构建,但我尝试过无效,不知道是否是跟我数据都是post相关,网上很多资料都用jsonp,但jsonp好像也无法post,因为后端是.net mvc,参数都是用实体类来接收,所以要改成rest api比较麻烦,后面一直研究跨域的问题,这里有几点说明:

本来是用vs2015开发ionic + cordova,本身也集成了cordova,直接启动在ripple模拟器里可以设置local的代理,这样就避免了跨域,但奈何想脱离vs,因为没可能让做前端的还要装个vs,太庞大了,而且vs来做的话环境不是很好搭建,而且那个node_modules目录层次结构不知道为什么那么深,拷贝都拷贝不了,总而言之,各种问题,参考资料又太少,还是用纯前端来处理吧,虽然vs开发也有很多优点,比如remotebuild ios等等。

goole 的插件:Allow-Control-Allow-Origin: *也安装了,不知为何也不能跨域,可能是因为post的原因。

后面跟踪调试,发现其实已经跨域了的,但提示Options....之类的请求,404的问题,然后在后端增加了一个和post方法同名的HttpOptions的方法,也可以不写[HttpOptions]特性,这样的话调试发现会请求两次,第一次会进这个HttpOptions方法,原来是要先进行预检测,怎样去掉这个预检测呢,后面发现要加上$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';这句,然后发现不会两次请求了,之前加的那个空方法也可以删了。但又发现参数都没有传递过来,后台Action的参数实体对象的值都为空,后面又继续排查,发现参数都提交到request.form里了,然后就知道了参数提交过来的两种方式:form data和request.payload,这样就需要将form data转换成request.payload,最终的解决办法是参考:

http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/

就解决了。

最终发现升级ionic1.7.14后$ionicView.enter这个事件无效了,还不知道原因....

最终要说的是,实现ionic 的post跨域,不使用代理和jsonp的方式的解决办法如下:

1.asp.net mvc服务端配置:

 <httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
</customHeaders>
</httpProtocol>

2.客户端index.html页面配置

<meta http-equiv="Content-Security-Policy" content="script-src * 'unsafe-eval'; connect-src * 'unsafe-eval';object-src 'self'; style-src * 'unsafe-inline'; img-src *">

3.客户端app.js配置

$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
/**
* The workhorse; converts an object to x-www-form-urlencoded serialization.
* @param {Object} obj
* @return {String}
*/
var param = function(obj) {
var query = '',
name, value, fullSubName, subName, subValue, innerObj, i; for (name in obj) {
value = obj[name]; if (value instanceof Array) {
for (i = ; i < value.length; ++i) {
subValue = value[i];
fullSubName = name + '[' + i + ']';
innerObj = {};
innerObj[fullSubName] = subValue;
query += param(innerObj) + '&';
}
} else if (value instanceof Object) {
for (subName in value) {
subValue = value[subName];
fullSubName = name + '[' + subName + ']';
innerObj = {};
innerObj[fullSubName] = subValue;
query += param(innerObj) + '&';
}
} else if (value !== undefined && value !== null)
query += encodeURIComponent(name) + '=' + encodeURIComponent(value) + '&';
} return query.length ? query.substr(, query.length - ) : query;
}; // Override $http service's default transformRequest
$httpProvider.defaults.transformRequest = [function(data) {
return angular.isObject(data) && String(data) !== '[object File]' ? param(data) : data;
}];

4.再贴一下LoginService.js的代码

login: function (user) {
var deferred = $q.defer();
var url = commConfig.domain + ‘xxx’
$http.post(url, user)
.success(function (data) {
//业务处理
deferred.resolve(data);
}).error(function (error) {
//业务处理
deferred.reject(error);
}); return deferred.promise;
},

Ionic的跨域问题的更多相关文章

  1. [ionic开源项目教程] - 第14讲 ionic解决跨域问题

    [ionic开源项目教程] 第14讲 使用jsonp解决跨域问题 相信很多朋友在开发中都会遇到以下这个问题. No 'Access-Control-Allow-Origin' header is pr ...

  2. 关于ionic的跨域问题

    例如你的api原地址请求是 http://10.100.100.100:8080/service/, 1.那么你应该在项目内api请求改成 /service/, 注意红色部分是ionic serve ...

  3. 通过设置Ionic-Cli代理解决ionic serve跨域调试问题

    Ionic-Cli代理设置: 打开ionic.config.json文件,添加proxies代理配置字段: { "name": "ion", "app ...

  4. 解决 Ionic 浏览器跨域问题

    <system.webServer> <httpProtocol> <customHeaders> <add name="Access-Contro ...

  5. ionic+nodejs开发遇到的跨域和post请求数据问题

    最近学习ionic+nodejs开发混合app中遇到了一些问题,在此总结一下. 开发环境搭建 项目地址 https://github.com/ytudt/nodejsApp 代码和问题都会在之后的学习 ...

  6. 转载:ionic+nodejs开发遇到的跨域和post请求数据问题

    转载自:http://www.cnblogs.com/ytu2010dt/p/5471366.html 最近学习ionic+nodejs开发混合app中遇到了一些问题,在此总结一下. 项目地址 htt ...

  7. 解决 ionic 中的 CORS(跨域)

    译者注:本人翻译功力有限,所以文中难免有翻译不准确的地方,凑合看吧,牛逼的话你看英文版的去,完事儿欢迎回来指正交流(^_^) 如果你通过 ionic serve 或者 ionic run 命令使用或 ...

  8. 「Ionic」使用chrom時的跨域問題

    前言:在angularjs請求數據時,會遇到跨域問題,解決辦法有很多,但是都不是我想要的(很多人云亦云,都解決不了問題).如果你只是想在本機測試使用,可以參考如下設置.   具體辦法: 1.在电脑上新 ...

  9. Chrome浏览器跨域问题

    最近在学习Ionic,调试http请求的时候遇到跨域问题 解决办法:使用chrome浏览器安装这个插件:Allow-Control-Allow-Origin: *

随机推荐

  1. Python控制window进行简单的消息弹窗

    有人提到可以用easygui 稍后尝试一下

  2. linux搭建LAMP

    先简要概述下本文要点:(操作系统采用CentOS6.5 x64) 1.分别安装搭建lamp服务环境: 2.采用lamp一键安装包搭建环境: 3.在lamp环境中初步搭建起一个网站: 一. 分别安装搭建 ...

  3. 安装升级npm依赖

    npm-check 能够自动检索npm包版本,并且提供交互操作界面: 有以下功能: 1.告诉你那些依赖已经过时: 2.在你决定升级时,给你提供依赖包的文档: 3.提示某个依赖没有被你使用: 4.支持全 ...

  4. 1003. Emergency (25)

    As an emergency rescue team leader of a city, you are given a special map of your country. The map s ...

  5. Linux下的系统调用

    张雨梅   原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10000 1.linux的的用户态与内核 ...

  6. 一些JavaScript中的DOM的优化小技巧

    在进行DOM优化时需要关注的问题有:修改DOM的时候,会引起页面的重排,重绘.因为JS是单线程执行的,那么在重排重绘的过程中可能会阻塞用户的操作.为了更好的用户体验,必须要严格控制这些操作. 一.对象 ...

  7. TCP/IP协议学习(七) 基于C# Socket的Web服务器---动态通讯实现

    目录 (1).基于Ajax的前端实现 (2).Web服务器后端处理 一个完整的web服务器,不仅需要满足用户端对于图片.文档等资源的需求:还能够对于用户端的动态请求,返回指定程序生成的数据.支持动态请 ...

  8. 关于C语言结构体,指针,声明的详细讲解。——Arvin

    关于结构体的详细分析 只定义结构体 struct Student { int age; char* name; char sex;//结构体成员 };//(不要忘记分号) Student是结构体的名字 ...

  9. Hadoop 集群搭建

    Hadoop 集群搭建 2016-09-24 杜亦舒 目标 在3台服务器上搭建 Hadoop2.7.3 集群,然后测试验证,要能够向 HDFS 上传文件,并成功运行 mapreduce 示例程序 搭建 ...

  10. Evolutionary Computing: [reading notes]On the Life-Long Learning Capabilities of a NELLI*: A Hyper-Heuristic Optimisation System

    resource: On the Life-Long Learning Capabilities of a NELLI*: A Hyper-Heuristic Optimisation System ...