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: *
随机推荐
- Java开发中经典的小实例-(二分法)
public int binarySearch(int[] data,int aim){//以int数组为例,aim为需要查找的数 int start = 0; int end = data.leng ...
- sublimetext3备份
http://files.cnblogs.com/files/hwd13/Data.zip http://files.cnblogs.com/files/hwd13/sublime3.zip
- python走起之第十一话
Redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorte ...
- Redis学习-基础环境介绍(二)
1.通过VMware安装了Centos6.8系统 2.Reids安装过程,需要GCC环境 »通过下面命令,根据提示直接安装 1 yum install gcc 3.Redis选用的是3.2.4(建议使 ...
- 删除文件夹工具【fuckwinfsdel】,如 node_modules
强力删除文件夹. 安装 npm install fuckwinfsdel -g 使用 fuckwinfsdel youdir 例 fuckwinfsdel node_modules 项目地址 http ...
- 在Spring里进行单元测试Junit
搭建Spring环境(自行搭建): @RunWith注解指定使用springJunit的测试运行器 @ContextConfiguration注解指定测试用的spring配置文件的位置 import ...
- linux笔记:linux服务管理
linux服务的分类: 启动和自启动: 查询已经安装的服务: RPM包的默认安装路径: 独立服务的启动: 独立服务的自启动: 基于xinetd的服务的管理: xinetd服务的自启动: 源码包安装服务 ...
- Matrix
记载: Matrix Matrix是Android 提供的一个矩阵工具类,位于"android.graphics.Matrix"包下,它本身不能对图像或View进行变换, 但它可以 ...
- Sprint3总结和成员个人总结
Sprint3总结 一.类名:软件工程-第三阶段 二.时间:至12.18 三.选题内容:web版-餐厅到店点餐系统 四.(1)团队博客地址: http://www.cnblogs.com/queenj ...
- Linux下漏洞提权
Linux下的漏洞提权 linux下一般都是系统漏洞提权,分为以下几个步骤: