为什么same-origin-policy在本地域上阻止此javascript调用?

时间:2018-11-14 12:00:20

标签: javascript same-origin-policy

我在http://mysite.local/上运行了一个本地开发站点 (如果有关联,则是安装了Grappelli的Django管理站点)。

管理站点会打开一个弹出窗口以执行某些操作(即通过showRelatedObjectLookupPopup()

由于先前具有相同来源政策的类似问题(在生产中,管理站点从CDN域中加载了一些URL,这可能会触发它),我们有一个“规范化” JS函数可以明确设置:

document.domain = "mysite.local";

在页面加载时,在父级和弹出式窗口中都有。

弹出窗口包含一个带有onclick处理程序的链接,该链接会触发父级中的JS函数:

onclick="opener.dismissRelatedLookupPopup(window, '422'); return false;"

在Chrome或FF中单击此链接会导致类似的浏览器错误:

  

拒绝访问以下属性的权限:“ dismissRelatedLookupPopup”   跨域对象

  

阻止了原点为“ http://mysite.local”的框架访问   跨域框架。

弹出窗口和打开程序的URL共享相同的协议,域和端口。

这只是本地域上的一个问题。在dev / uat / production网站(例如dev.mysite.com)上,通过上述“ normaliser”功能将所有域的域都设置为超域“ mysite.com”,弹出窗口可以在父母。

是什么在本地域上阻止了它?我错过了什么?

1 个答案:

答案 0 :(得分:0)

按照@charlietfl最初的建议,切换本地域似乎确实解决了该问题。现在,它以 $categories = Category::select('*')->get(); //for example $array = [ [ "pos" => "0", "col" => "1", "row" => "1", "size_x" => "2", "size_y" => "1", "cat_id" => 1, ], [ "pos" => "0", "col" => "1", "row" => "2", "size_x" => "2", "size_y" => "1", "cat_id" => 10, ] ]; $grids = collect($array); if ($grids->isNotEmpty()) { $grids_arr = $grids->pluck("cat_id")->toArray(); $grids_arr = array_map('intval', $grids_arr); //Please add these three lines to your code $catIds = $categories->pluck('cat_id')->toArray(); $diff = array_diff($catIds, $grids_arr); $grids_arr = array_merge($grids_arr, $diff); //----- $sorted = $categories->sortBy(function ($model) use ($grids_arr) { return array_search($model->cat_id, $grids_arr); }); return $sorted->values()->all(); } 而不是local.mysite.com的身份在本地运行,并且同源错误消失了。我仍然不清楚是什么引发了错误(是因为该域只有两个部分而不是三个部分?它是针对以“ .local”结尾的域吗?),但是在极少数情况下,其他任何人都会跳闸在此之上,这就是为我解决的问题。