Ionic的跨域问题
跨域大家都不陌生,但最近一直遇到一个坑,也是自身对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的跨域问题的更多相关文章
- [ionic开源项目教程] - 第14讲 ionic解决跨域问题
[ionic开源项目教程] 第14讲 使用jsonp解决跨域问题 相信很多朋友在开发中都会遇到以下这个问题. No 'Access-Control-Allow-Origin' header is pr ...
- 关于ionic的跨域问题
例如你的api原地址请求是 http://10.100.100.100:8080/service/, 1.那么你应该在项目内api请求改成 /service/, 注意红色部分是ionic serve ...
- 通过设置Ionic-Cli代理解决ionic serve跨域调试问题
Ionic-Cli代理设置: 打开ionic.config.json文件,添加proxies代理配置字段: { "name": "ion", "app ...
- 解决 Ionic 浏览器跨域问题
<system.webServer> <httpProtocol> <customHeaders> <add name="Access-Contro ...
- ionic+nodejs开发遇到的跨域和post请求数据问题
最近学习ionic+nodejs开发混合app中遇到了一些问题,在此总结一下. 开发环境搭建 项目地址 https://github.com/ytudt/nodejsApp 代码和问题都会在之后的学习 ...
- 转载:ionic+nodejs开发遇到的跨域和post请求数据问题
转载自:http://www.cnblogs.com/ytu2010dt/p/5471366.html 最近学习ionic+nodejs开发混合app中遇到了一些问题,在此总结一下. 项目地址 htt ...
- 解决 ionic 中的 CORS(跨域)
译者注:本人翻译功力有限,所以文中难免有翻译不准确的地方,凑合看吧,牛逼的话你看英文版的去,完事儿欢迎回来指正交流(^_^) 如果你通过 ionic serve 或者 ionic run 命令使用或 ...
- 「Ionic」使用chrom時的跨域問題
前言:在angularjs請求數據時,會遇到跨域問題,解決辦法有很多,但是都不是我想要的(很多人云亦云,都解決不了問題).如果你只是想在本機測試使用,可以參考如下設置. 具體辦法: 1.在电脑上新 ...
- Chrome浏览器跨域问题
最近在学习Ionic,调试http请求的时候遇到跨域问题 解决办法:使用chrome浏览器安装这个插件:Allow-Control-Allow-Origin: *
随机推荐
- sublimetext3备份
http://files.cnblogs.com/files/hwd13/Data.zip http://files.cnblogs.com/files/hwd13/sublime3.zip
- this 的值到底是什么?
你可能遇到过这样的 JS 面试题: var obj = { foo: function(){ console.log(this) } } var bar = obj.foo obj.foo() // ...
- Remoting&WebService的区别之处
Remoting与Web Services的区别是:(1)既支持TCP信道又支持HTTP信道,传输速度快(2)即可传输XML的SOAP包又可传输二进制流,效率高(3)Remoteing主要用于C/S结 ...
- 《开源大数据分析引擎Impala实战》目录
当当网图书信息: http://product.dangdang.com/23648533.html <开源大数据分析引擎Impala实战>目录 第1章 Impala概述.安装与配置.. ...
- 20145218&20145240 《信息安全系统设计基础》实验二 固件设计
20145218&20145240 <信息安全系统设计基础>实验二 固件设计 实验报告链接:http://www.cnblogs.com/20145240lsj/p/6035512 ...
- 原生Android App项目调用Untiy导出的Android项目
背景:采用Google VR SDK for Unity 开发3D场景功能,然后导出Android项目,合并到一个Android App里面,供其它Activity调用. 用Google VR for ...
- 删除Kafka的topic
刚接触Kafka,开始认为删除一个topic只是运行一下Kafka-topic.sh的delete命令就行了,但是,事实却不是这样,会出现两种情况:(1) 如果topic没有使用过即没有传输过消息,可 ...
- 简单谈一谈JavaScript中的变量提升的问题
1,随笔由来 第一天开通博客,用于监督自己学习以及分享一点点浅见,不出意外的话,应该是一周一更或者一周两更. 此博客所写内容主要为前端工作中遇上的一些问题以及常见问题,在此基础上略微发表自己的一点浅 ...
- FPGA图像处理 两路sensor的色调不一致
怎么调?可以让两路sensor的色调一致.
- mybatis高级(2)_数据库中的列和实体类不匹配时的两种解决方法_模糊查询_智能标签
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...