让 QtWebkit 支持跨域CROS - nowboy的CSDN博客 - 博客频道 - CSDN.NET

让 QtWebkit 支持跨域CROS - nowboy的CSDN博客 - 博客频道 - CSDN.NET

让 QtWebkit 支持跨域CROS

450人阅读 评论(5) 收藏 举报

最近公司的一个项目中,使用了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,这样做只是为了方便调试界面。

你可能感兴趣的:(webkit)