我正在开发一个测试页面,只有我自己和Google Chrome才能使用。有这样的条件来执行跨域请求到第三方服务器(不允许这样的请求)吗?请求可能是GET
或OPTIONS
。如何在JavaScript/Chrome中本地执行跨域请求?
(我知道关于Chrome的扩展名如高级REST客户端,它可以执行这样的请求,但它并不能帮助我,因为复杂的计算,应事先进行申请执行)
我正在开发一个测试页面,只有我自己和Google Chrome才能使用。有这样的条件来执行跨域请求到第三方服务器(不允许这样的请求)吗?请求可能是GET
或OPTIONS
。如何在JavaScript/Chrome中本地执行跨域请求?
(我知道关于Chrome的扩展名如高级REST客户端,它可以执行这样的请求,但它并不能帮助我,因为复杂的计算,应事先进行申请执行)
一种选择是完全禁用同源策略,为Disable same origin policy in Chrome详述。这可能会为你带来诀窍,但它有点不雅,因为它关闭了整个浏览器实例的同源策略。
第二个选项是创建一个小的Chrome扩展,它包含您需要加载的所有文件。它将使您的文件可通过chrome-extension://...
访问,并且只有该扩展名中的文件才能免受同源策略的影响。
创建一个新的文件夹,把你的测试Web页面中,然后创建一个manifest.json
文件相同的文件夹:
/testing_extension
test_page_immune_from_same_origin.html
script_used_by_test_page.js
styles_for_test_page.css
manifest.json
的manifest.json
内容应
{
"name": "All-origin access extension",
"manifest_version": 2,
"version": "1.0",
"permissions": ["<all_urls>"]
}
加载扩展通过chrome://extensions
,启用Developer Mode
,然后选择具有Load unpacked extension...
选项的新文件夹。
您可以查看您的页面作为扩展资源chrome-extension://[app_id]/[file_name]
,其中“app_id
”是在chrome://extensions
页面上为扩展名列出的散列。 (它将是一串长长的小写字母。)现在,当页面执行跨源资源时,它会通过浏览器扩展的权限执行此操作,而不受同源策略的限制。
请注意,您需要移动任何inline scripts into separate files以符合扩展CSP要求。
谢谢!我能否通过这种方式在线修改我的页面('test_page_immune_from_same_origin.html')?即如果我需要更改某些内容,是否需要再次删除/添加扩展名?或者,我需要刷新页面吗? – 2014-09-05 13:16:39
我想你可以随时刷新扩展页面,只要你改变文件;除非您更改清单,否则无需重新加载扩展。如果您的文件托管在Web服务器上,则需要将其下载到本地文件系统,并且如果需要从Web服务器版本中提取任何更改,请重新下载。 – apsillers 2014-09-05 13:23:12
谢谢,它的工作原理! (我必须稍微改变页面 - 以符合内容安全策略 - https://developer.chrome.com/extensions/contentSecurityPolicy) – 2014-09-05 13:37:37
的一种方法是,以满足您将文件从Web服务器而不是本地文件系统中删除。另一种方法是用一个标志启动浏览器:
chrome --disable-web-security
(从Cross-origin image load denied on a local image with THREE.js on Chrome)
更广泛的标志列表在这里:http://peter.sh/experiments/chromium-command-line-switches/
谢谢。我之前阅读过有关此标志的信息,但实际上并不想禁用所有标签页/页面的Web安全性。 – 2014-09-05 13:18:26
我正在做类似的项目这和我不得不上传一个简单的html文件到我的一个prod服务器进行测试,所以我可以测试跨域功能。 指向localhost的html文件,所以它只会在开发时适用于我。
jQuery代码看起来像这样(以防万一它有助于):
$.ajax({
type: "POST",
dataType: "json",
cache: false,
url: url,
data: data,
crossDomain: true,
success: function (data) {
ATSJBAjax = null;
if (callback != null) callback(data);
}
});
而且我使用C#/ MVC,我只好一个属性添加到补充说:“访问 - 所有的控制器方法控制 - 允许 - 来源“的响应头,所以Chrome会好起来的。我叫属性“AllowCrossDomainAccess”,这ref'd下面的类:
public class AllowCrossDomainAccessAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
base.OnActionExecuting(filterContext);
}
}
谢谢,但这与我有什么不同 - 我应该与第三方服务器通信,所以我不能添加标头'Access-Control-Allow-Origin'。 – 2014-09-05 13:17:45
我以前没有用过它,但是你可以不发出ajax请求并使用类似'beforeSend'的东西吗? – SpYk3HH 2014-09-05 12:59:26
@ SpYk3HH,不要以为我理解你 - 在发送前怎么能帮到你呢? – 2014-09-05 13:01:44
你说'没有帮助我,因为复杂的计算应该在请求执行之前执行'我想你的问题是在提出请求之前如何执行这些请求。在这种情况下,只需使用'beforeSend'与Losbear的回答低于 – SpYk3HH 2014-09-05 13:04:14