AngularJs 未加载外部资源

IT技术 javascript angularjs cordova
2021-01-15 04:40:45

使用 Angular 和 Phonegap,我正在尝试加载远程服务器上的视频,但遇到了问题。在我的 JSON 中,URL 是作为普通 HTTP URL 输入的。

"src" : "http://www.somesite.com/myvideo.mp4"

我的视频模板

 <video controls poster="img/poster.png">
       <source ng-src="{{object.src}}" type="video/mp4"/>
 </video>

我的所有其他数据都已加载,但是当我查看控制台时,出现此错误:

Error: [$interpolate:interr] Can't interpolate: {{object.src}}
Error: [$sce:insecurl] Blocked loading resource from url not allowed by $sceDelegate policy.  URL

我尝试添加$compileProvider我的配置设置,但它没有解决我的问题。

$compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|tel):/);

我看到了这篇关于跨域问题帖子,但我不确定如何解决这个问题或我应该往哪个方向发展。有什么想法吗?任何帮助表示赞赏

6个回答

另一个简单的解决方案是创建一个过滤器:

app.filter('trusted', ['$sce', function ($sce) {
    return function(url) {
        return $sce.trustAsResourceUrl(url);
    };
}]);

然后在中指定过滤器ng-src

<video controls poster="img/poster.png">
       <source ng-src="{{object.src | trusted}}" type="video/mp4"/>
</video>
为我工作,确实比使用 iframe 更好。
2021-03-17 04:40:45
最佳答案,更有棱角的精神,并且由于某些原因,它在其他解决方案不起作用的地方起作用。非常感谢!
2021-03-25 04:40:45
绝对是最优雅和棱角分明的解决方案。
2021-04-04 04:40:45

这是唯一对我有用的解决方案:

var app = angular.module('plunker', ['ngSanitize']);

app.controller('MainCtrl', function($scope, $sce) {
  $scope.trustSrc = function(src) {
    return $sce.trustAsResourceUrl(src);
  }

  $scope.movie = {src:"http://www.youtube.com/embed/Lx7ycjC8qjE", title:"Egghead.io AngularJS Binding"};
});

然后在 iframe 中:

<iframe class="youtube-player" type="text/html" width="640" height="385"
        ng-src="{{trustSrc(movie.src)}}" allowfullscreen frameborder="0">
</iframe>

http://plnkr.co/edit/tYq22VjwB10WmytQO9Pb?p=preview

如果没有 iFrame,这可能吗?我需要嵌入一个视频,其中会话信息确定是否允许消费者观看视频。会话信息不通过 iFrame 携带。
2021-03-14 04:40:45
很好,如果你可以使用 iframe
2021-03-30 04:40:45

使用 $sceDelegateProvider 将资源列入白名单

这是由 Angular 1.2 中实施的新安全策略引起的。它通过防止黑客拨出(即向外部 URL 发出请求,可能包含有效负载)使 XSS 变得更加困难。

要正确绕过它,您需要将要允许的域列入白名单,如下所示:

angular.module('myApp',['ngSanitize']).config(function($sceDelegateProvider) {
  $sceDelegateProvider.resourceUrlWhitelist([
    // Allow same origin resource loads.
    'self',
    // Allow loading from our assets domain.  Notice the difference between * and **.
    'http://srv*.assets.example.com/**'
  ]);

  // The blacklist overrides the whitelist so the open redirect here is blocked.
  $sceDelegateProvider.resourceUrlBlacklist([
    'http://myapp.example.com/clickThru**'
  ]);
});

此示例取自您可以在此处阅读的文档:

https://docs.angularjs.org/api/ng/provider/$sceDelegateProvider

请务必在您的应用程序中包含 ngSanitize 以使其正常工作。

禁用该功能

如果你想关闭这个有用的功能,并且你确定你的数据是安全的,你可以简单地允许 **,如下所示:

angular.module('app').config(function($sceDelegateProvider) {
  $sceDelegateProvider.resourceUrlWhitelist(['**']);
});
这是解决此问题的更清洁、全局和安全的方法。
2021-03-24 04:40:45
“拨出”对于试图了解问题的人来说并不是一个很好的术语。
2021-03-25 04:40:45
谢谢@Ringo - 我添加了一条评论来澄清。
2021-03-27 04:40:45
注意:如果resourceUrlWhitelist不知何故对您不起作用,请检查域名后是否没有双斜杠(从变量连接内容时很容易发生这种情况,并且它们都有斜杠)
2021-04-12 04:40:45

这里有同样的问题。我需要绑定到 Youtube 链接。作为全局解决方案,对我有用的是将以下内容添加到我的配置中:

.config(['$routeProvider', '$sceDelegateProvider',
        function ($routeProvider, $sceDelegateProvider) {

    $sceDelegateProvider.resourceUrlWhitelist(['self', new RegExp('^(http[s]?):\/\/(w{3}.)?youtube\.com/.+$')]);

}]);

在其中添加'self'很重要 - 否则将无法绑定到任何 URL。角度文档

'self' - 特殊字符串 'self' 可用于匹配与使用相同协议的应用程序文档相同域的所有 URL。

有了这个,我现在可以直接绑定到任何 Youtube 链接。

显然,您必须根据需要自定义正则表达式。希望能帮助到你!

解决此问题的最佳且简单的解决方案是将您的数据从此函数传递到控制器中。

$scope.trustSrcurl = function(data) 
{
    return $sce.trustAsResourceUrl(data);
}

在 html 页面中

<iframe class="youtube-player" type="text/html" width="640" height="385" ng-src="{{trustSrcurl(video.src)}}" allowfullscreen frameborder="0"></iframe>