让 QtWebkit 支持跨域CROS - nowboy的CSDN博客 - 博客频道 - CSDN.NET
让 QtWebkit 支持跨域CROS - nowboy的CSDN博客 - 博客频道 - CSDN.NET
最近公司的一个项目中,使用了QtWebkit来创建windows本地应用程序。
大致说明:
1》最外面的框架是一个QWebView加载一个index.html;
2》index.html内嵌若干个iframe,iframe的src有本地的html文件,也有网络上的html文件;
3》也就是说,整个软件的界面基本上都是用html/css/javascript来编写的;
4》在该项目中,使用了QtWebkit为index.html拓展了几个javascript方法(用C++拓展javascript的本地功能);
5》问题出现了:>>>跨域问题(CROS)
在QWebInspector中调试页面时,
1.当index.html中的javascript函数去调用网络上的页面的方法或操作网络上的页面的DOM,或者网络上的页面中的javascript方法去调用index.html中那些QtWebkit拓展的方法时,javascirpt控制台出现了红色的错误提示:
Unsafe JavaScript attempt to access frame with URL "http://some/iframe.html" from frame with URL "file/to/path/index.html"
2.当在本地index.html中用AJAX请求远程API的JSON数据时,控制台输出:
XMLHttpRequest cannot loadhttp://some/api?id=412311. Origin null is not allowed by Access-Control-Allow-Origin.
跨域问题CROS;
问题2的解决方法:
QWebView::settings()->setAttribute(QWebSettings::LocalContentCanAccessRemoteUrls, true);
OK!
注意:上面那行代码仅解决了本地的html文件跨域请求web上的数据,并不能解决web上的页面跨域请求另一个域上web数据,当然也有解决方法,那就是在api服务器的页面上加header:<?php header("Access-Control-Allow-Origin: *"); ?>,或者配置api服务器使其全局支持跨域操作。
问题1很棘手,问题1的解决方法:
谷歌、qt-project.org、百度,最后在谷歌搜索结果中得到答案:https://bugs.webkit.org/attachment.cgi?id=65204&action=prettypatch
原因:
https://lists.webkit.org/pipermail/webkit-qt/2010-September/000828.html
这样一来,所有的跨域、unsafe javascript... 啥的问题都不在话下了。
另:
启动Chrome时加上--disable-web-security参数可以支持跨域,示例:
cmd>chrome.exe --disable-web-security,这样做只是为了方便调试界面。
让 QtWebkit 支持跨域CROS - nowboy的CSDN博客 - 博客频道 - CSDN.NET,古老的榕树,5-wow.com
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。