禁用同源策略/在 WebKit WebViews 中创建跨域 XMLHttpRequests?

Posted

技术标签:

【中文标题】禁用同源策略/在 WebKit WebViews 中创建跨域 XMLHttpRequests?【英文标题】:Disable the Same Origin Policy / making cross domain XMLHttpRequests in WebKit WebViews? 【发布时间】:2011-01-26 03:30:50 【问题描述】:

我想在我自己的嵌入式 WebView 中禁用 XMLHttpRequests 的同源策略。我可以控制在 WebView 中加载的页面/正在执行的代码,所以我不关心执行相同的源策略。我想做跨域请求。

我已尝试实现 WebPolicyDelegate 和 WebResourceLoadDelegate,但似乎没有为 XMLHttpRequests 调用它们。

【问题讨论】:

你似乎找到了答案,你能分享一下是什么吗?我将 WebView 嵌入到我的 Cocoa 程序中,如下所示: - (void)applicationDidFinishLaunching:(NSNotification )aNotification NSView contentView = [window contentView]; WebView* webView = [[WebView alloc] initWithFrame:contentView.frame]; webView.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable; [contentView addSubview:webView]; [[webView mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"google.com" ]]]; 【参考方案1】:
void WebSettingsImpl::setWebSecurityEnabled(bool enabled)

    m_settings->setWebSecurityEnabled(enabled);

希望这是您所需要的! 你可以给我发个关于 webkit 的消息。

【讨论】:

【参考方案2】:

我一直在寻找如何在 OSX 上执行此操作。原来WebPreferences 有一个私有方法:setWebSecurityEnabled。将此设置为 false,它应该可以工作。

http://trac.webkit.org/browser/trunk/Source/WebKit/mac/WebView/WebPreferences.mm?rev=111350#L1011

例如:

NSString* noSecurityPreferencesId = @"noSecurity";
WebPreferences* prefs = [[WebPreferences alloc] initWithIdentifier: noSecurityPreferencesId];
[prefs setWebSecurityEnabled: false];
[webView setPreferencesIdentifier: noSecurityPreferencesId];

【讨论】:

【参考方案3】:

我认为无论如何你都很难找到一种对你有用的方式来做到这一点。您是否考虑过 JSONP 而不是 XHR? http://en.wikipedia.org/wiki/JSON

高级概述是 JSONP 使用与您在上面使用的相同的机制来请求外部脚本。不同之处在于您的服务器将识别这一点并将 JSON 响应打包为回调方法的参数。当您的站点收到此“脚本”时,它会执行它,从而将数据直接返回到您的回调方法中。

如果您能够使用像 jQuery 这样的框架,那么大部分客户端都会为您透明地处理。事实上,它将使用与 XHR (AJAX) 请求几乎相同的方法。在这里查看:http://api.jquery.com/jQuery.getJSON/

【讨论】:

我对 JSONP 非常熟悉,但这不是我想要的。我只是想在嵌入 WebView 的受控环境中禁用 SOP。我不是在谈论在普通 Web 浏览器中禁用 SOP,因为我知道这是不可能的(有充分的理由)【参考方案4】:

您可以尝试将Access-Control-Allow-Origin: * 标头添加到服务器响应中。不过,我认为并非所有浏览器都支持它。

更多信息:https://developer.mozilla.org/en/HTTP_access_control

【讨论】:

以上是关于禁用同源策略/在 WebKit WebViews 中创建跨域 XMLHttpRequests?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Safari(Windows 7)中禁用同源策略?

Chrome:禁用本地主机的同源策略

在 TWebbrowser 中禁用同源策略

在 Android Chrome 上禁用同源策略

在 Mobile Safari 中禁用同源策略

在 Chrome 中禁用同源策略