AngularJs 跨域问题

来源:互联网 发布:有效抵御网络黑客攻击 编辑:程序博客网 时间:2024/06/06 19:55

访问其他网站的API 的时候,有时候会出现这样的问题:


XMLHttpRequest cannot load 

‘https://’  (某网站)

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.


按照chrome的报错,上网找了下原因和解决办法。


原因: 浏览器出于安全考虑,默认禁止跨域访问。


那么什么是跨域访问?


跨域访问就是两个不同域名之间通过AJAX 跨域名请求或发送数据,这违反了同源策略,是不安全的。


解决方法:

    网上的解决方大致分三种:

1. 浏览器设置 : 传送门: http://blog.csdn.net/ziwoods/article/details/51062206

        2. 客户端解决方法:   传送门:  http://blog.csdn.net/net_lover/article/details/5172509

3. 服务器端:传送门 : http://blog.csdn.net/james_wade63/article/details/50772041


我用的是客户端解决方案 使用JSONP 来解决跨域访问问题:

首先将 $http.post() 改成  $http.jsonp();  

        当天真的我以为问题已经得到解决的时候, console 给我了一个惊喜 

        Error : [$sce :insecurl] ;

       

        what?  用过 ng-repeat 循环输出带 html 元素 的同学也许碰到过这样一个问题:

输出在网页里的html 元素原样输出了,并没有被解析,其实这是 angularJS 开发人员为了安全起见做出的决策 , 这时候就需要用到 $sce


         $sce 常见的方法有:


               $sce.trustAs(type,name);
$sce.trustAsHtml(value);
$sce.trustAsUrl(value);
$sce.trustAsResourceUrl(value);
$sce.trustAsJs(value);
        
    


    

 $scope.trustUrl = $sce.trustAsResourceUrl("http://...........");        $http.jsonp($scope.trustUrl).then(function(response){          $scope.result =response.data;        });

         这样跨域问题就解决了:)