AngularJS加载SSRS报表遇$sce:insecurl错误,求解决办法
解决AngularJS加载动态SSRS报表URL的$sce:insecurl错误
这个错误是AngularJS的**$sce(Strict Contextual Escaping)**安全机制导致的——它会拦截未被标记为安全的动态资源URL,你通过配置生成的报表URL默认不在信任列表里,因此被阻止加载。以下是两种可行的解决办法:
方法一:在控制器中标记URL为安全资源
通过$sce.trustAsResourceUrl()方法,把动态生成的报表URL标记为AngularJS信任的资源地址。
- 在控制器中注入
$sce服务 - 用
$sce.trustAsResourceUrl()包装你的报表URL
修改后的控制器代码:
function BalancesController($sce, ......) { var vm = this; function initialize() { var rawReportUrl = window.ReportLoadBaskets + "?rs:Embed=true"; vm.report = $sce.trustAsResourceUrl(rawReportUrl); } }
视图中的ng-src="{{vm.report}}"无需修改。
方法二:配置全局URL白名单
如果你的应用中有多个来自同一域名的报表需要加载,可以通过$sceDelegateProvider配置全局白名单,允许该域名下的所有资源URL。
在你的AngularJS模块配置中添加以下代码:
angular.module('你的应用模块名', []) .config(function($sceDelegateProvider) { $sceDelegateProvider.resourceUrlWhitelist([ // 允许同源资源加载 'self', // 允许报表服务器的所有URL,替换成你的实际域名,支持通配符** 'http://pcxxx/**' ]); });
配置完成后,控制器中无需再用$sce包装URL,直接赋值即可:
function BalancesController(......) { var vm = this; function initialize() { vm.report = window.ReportLoadBaskets + "?rs:Embed=true"; } }
两种方法的选择
- 方法一适合单个或少量动态URL的场景,针对性强
- 方法二更适合多个URL来自同一可信域名的场景,一次配置即可通用
内容的提问来源于stack exchange,提问作者Raulus
相关产品推荐
相关产品推荐

