什么是JS跨域、以及CORS解决方案

1 篇文章 0 订阅

一、什么是JS跨域

1、跨域:在了解跨域之前,首先要知道什么是同源策略(same-origin policy)。简单来讲同源策略就是浏览器为了保证用户信息的安全,防止恶意的网站窃取数据,禁止不同域之间的JS进行交互。对于浏览器而言只要域名、协议、端口其中一个不同就会引发同源策略,从而限制他们之间如下的交互行为:
 

2、JS跨域:指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据。

那什么是不同的域呢?只要协议域名端口有任何一个不同,都被当作是不同的域。

举例:

域名说明是否允许访问
http://www.example.com协议不同不允许访问
https://www.example.com
http://www.example.com:8080端口不同不允许访问
http://www.example.com:3306
http://www.example.com域名不同不允许访问
http://www.baidu.com
http://www.example.com/a.js相同域下同一文件夹允许访问
http://www.example.com/b.js
http://www.example.com/a.js相同域下不同文件夹允许访问
http://www.example.com/js/a.js

注意

        1、ip相同,域名不同,也是跨域。 

        2、如果是协议和端口造成的跨域问题“前台”是无能为力的。

3、为什么要限制跨域访问:安全问题。

如果一个网页可以随意地访问另外一个网站的资源,那么就有可能在客户完全不知情的情况下出现安全问题。比如下面的操作就有安全问题:

1.用户访问www.mybank.com,登陆并进行网银操作,这时cookie啥的都生成并存放在浏览器;

2.用户突然想起件事,并迷迷糊糊的访问了一个邪恶的网站www.xiee.com;

3.这时该网站就可以在它的页面中,拿到银行的cookie,比如用户名,登陆token等,然后发起对www.mybank.com的操作;

4.如果这时浏览器不予限制,并且银行也没有做响应的安全处理的话,那么用户的信息有可能就这么泄露了。


4、为什么要跨域

既然有安全问题,那为什么又要跨域呢? 有时公司内部有多个不同的子域,比如一个是cart.jd.com ,而应用是放在app.jd.com , 这时想从 app.jd.com去访问 cart.jd.com 的资源就属于跨域。

 

二、解决方案

使用跨域资源共享(CORS)来跨域

CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。

它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。

只需要在后台中加上响应头来允许域请求!在被请求的Response header中加入以下设置,就可以实现跨域访问了!


//指定允许其他域名访问

'Access-Control-Allow-Origin:*'//或指定域

//响应类型

'Access-Control-Allow-Methods:GET,POST'

//响应头设置

'Access-Control-Allow-Headers:x-requested-with,content-type'

举例:

  @RequestMapping("/add")
    public Result add(Long id, Integer num) {
        /*CORS*/
        response.setHeader("Access-Control-Allow-Origin", "http://localhost:9105");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        
        /* 你的逻辑代码*/
}

Spring Framework 4.2 GA为CORS提供了第一类支持,使您比通常的基于过滤器的解决方案更容易和更强大地配置它。所以springMVC的版本要在4.2或以上版本才支持@CrossOrigin。

@CrossOrigin()注解来替代上面的两行话 参考@CrossOrigin()详解
@RequestMapping("/addGoodsToCartList")
    @CrossOrigin(origins = "http://localhost:9105", allowCredentials = "true")//默认是ture
    public Result addGoodsToCartList(Long itemId, Integer num) {
        /*CORS*/
       /* response.setHeader("Access-Control-Allow-Origin", "http://localhost:9105");
        response.setHeader("Access-Control-Allow-Credentials", "true");*/

       /*逻辑代码*/
}

 

Access-Control-Allow-Origin

Access-Control-Allow-OriginHTML5中定义的一种解决资源跨域的策略。

他是通过服务器端返回带有Access-Control-Allow-Origin标识的Response header,用来解决资源的跨域权限问题。

 使用方法:在response添加 Access-Control-Allow-Origin,例如

Access-Control-Allow-Origin:www.google.com

也可以设置为 * 表示该资源谁都可以用

前端JS代码

//添加商品到购物车

$scope.addToCart=function(){

    $http.get('http://localhost:9107/cart/addGoodsToCartList.do?itemId='

    + $scope.sku.id +'&num='+$scope.num,{'withCredentials':true}).success(

             function(response){

                 .......             

             }               

    );     

}

调用测试,可以实现跨域了。

CORS请求默认不发送Cookie和HTTP认证信息。如果要把Cookie发到服务器,一方面要服务器同意,指定Access-Control-Allow-Credentials字段。另一方面,开发者必须在AJAX请求中打开withCredentials属性。否则,即使服务器同意发送Cookie,浏览器也不会发送。或者,服务器要求设置Cookie,浏览器也不会处理。

 

 

 

 

 

文主要介绍CORS解决方案

其他解决方案请参考 js处理的8种跨域方法

 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
跨域(Cross-Origin)指的是在浏览器中,当一个网页的 JavaScript 代码尝试访问不同源(即不同域名、端口或协议)的资源时,就会触发跨域问题。浏览器为了保护用户的安全,限制了跨域资源的访问。 跨域问题可以通过以下几种方式进行解决: 1. JSONP(JSON with Padding):JSONP 是一种利用 `<script>` 标签可以跨域加载资源的特性来实现跨域请求的方法。服务器端返回的数据需要包裹在一个函数调用中,前端通过动态创建 `<script>` 标签来获取数据。但是 JSONP 只支持 GET 请求,并且存在安全性问题,容易受到 XSS 攻击。 2. CORS(Cross-Origin Resource Sharing):CORS 是一种现代浏览器支持的跨域解决方案。它通过在服务器端设置响应头来控制是否允许跨域请求。具体来说,服务器需要在响应头中设置 `Access-Control-Allow-Origin` 字段来指定允许的源(域名、端口或通配符 *),以及其他相关的 CORS 相关字段。通过这种方式,浏览器会根据响应头的配置判断是否允许跨域请求。 3. 代理服务器:可以通过在服务器端设置代理服务器来解决跨域问题。前端代码发送请求给同源的服务器,然后由服务器端代理转发请求到目标服务器,并将响应结果返回给前端。这种方式需要在服务器端进行配置,并且会增加服务器的负载。 4. WebSocket:WebSocket 是一种全双工通信协议,它可以在浏览器和服务器之间建立持久连接。由于 WebSocket 协议并不受同源策略的限制,因此可以用于跨域通信。 5. postMessage:postMessage 是一种在不同窗口或 iframe 之间进行跨域通信的方法。通过调用 `window.postMessage` 方法,可以在不同窗口之间传递消息。 需要注意的是,以上解决方案的可行性和适用性取决于具体的情况和需求。在使用时需要根据实际情况选择合适的解决方案

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值