2014-09-05 66 views
1

我正在开发一个测试页面,只有我自己和Google Chrome才能使用。有这样的条件来执行跨域请求到第三方服务器(不允许这样的请求)吗?请求可能是GETOPTIONS如何在JavaScript/Chrome中本地执行跨域请求?

(我知道关于Chrome的扩展名如高级REST客户端,它可以执行这样的请求,但它并不能帮助我,因为复杂的计算,应事先进行申请执行)

+0

我以前没有用过它,但是你可以不发出ajax请求并使用类似'beforeSend'的东西吗? – SpYk3HH 2014-09-05 12:59:26

+0

@ SpYk3HH,不要以为我理解你 - 在发送前怎么能帮到你呢? – 2014-09-05 13:01:44

+0

你说'没有帮助我,因为复杂的计算应该在请求执行之前执行'我想你的问题是在提出请求之前如何执行这些请求。在这种情况下,只需使用'beforeSend'与Losbear的回答低于 – SpYk3HH 2014-09-05 13:04:14

回答

1

一种选择是完全禁用同源策略,为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要求。

+0

谢谢!我能否通过这种方式在线修改我的页面('test_page_immune_from_same_origin.html')?即如果我需要更改某些内容,是否需要再次删除/添加扩展名?或者,我需要刷新页面吗? – 2014-09-05 13:16:39

+0

我想你可以随时刷新扩展页面,只要你改变文件;除非您更改清单,否则无需重新加载扩展。如果您的文件托管在Web服务器上,则需要将其下载到本地文件系统,并且如果需要从Web服务器版本中提取任何更改,请重新下载。 – apsillers 2014-09-05 13:23:12

+0

谢谢,它的工作原理! (我必须稍微改变页面 - 以符合内容安全策略 - https://developer.chrome.com/extensions/contentSecurityPolicy) – 2014-09-05 13:37:37

1

的一种方法是,以满足您将文件从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/

+0

谢谢。我之前阅读过有关此标志的信息,但实际上并不想禁用所有标签页/页面的Web安全性。 – 2014-09-05 13:18:26

1

我正在做类似的项目这和我不得不上传一个简单的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); 
    } 
} 
+0

谢谢,但这与我有什么不同 - 我应该与第三方服务器通信,所以我不能添加标头'Access-Control-Allow-Origin'。 – 2014-09-05 13:17:45