CORS跨域请求

一、概念

  这里说的 js 跨域是指通过 js 在不同的域之间进行数据传输或通信,比如用 ajax 向一个不同的域请求数据,或者通过 js 获取页面中不同域的框架中(iframe)的数据。只要协议、域名、端口有任何一个不同,都被当作是不同的域。

举例:

http://cas.qer.com
http://cart.qer.com

http://192.168.110/aa
http://192.168.112/aa

http://192.168.110/bb
https://192.168.110/bb

二、错误演示
在这里插入图片描述

①XMLHttpRequest是浏览器的底层对象,用来处理数据请求,这里报错说无法请求到该链接地址

②Access-Control-Allow-Origin是一个头信息,在跨域请求中首先要验证是否存在该头信息,如果不存在就无法跨域,默认情况下js是不允许跨域的

三、解决方案
注意:我们这里使用CORS的解决方案

①概念

CORS 是一个 W3C 标准,全称是"跨域资源共享"(Cross-origin resource sharing)。CORS 需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE 浏览器不能低于 IE10。 它允许浏览器向跨源服务器,发出 XMLHttpRequest 请求,从而克服了 AJAX 只能同源使用的限制。整个 CORS 通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS 通信与同源的 AJAX 通信没有差别,代码完全一样。浏览器一旦发现 AJAX 请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。因此,实现 CORS 通信的关键是服务器。只要服务器实现了 CORS 接口,就可以跨源通信。

②请求过程

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190121212242879.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMTcxNzI=,size_16,color_FFFFFF,t_70)

Preflight Request:预请求 ,询问浏览器是否能否被访问

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190121212432496.png)

然后服务器端给我们返回一个 Preflight Response :预响应,做一个可访问的响应

以上流程,主要还是判断响应里面有没有“Access-Control-Allow-Origin”这个头信息
头信息的形式:Access-Control-Allow-Origin:http://192.168.110/bb

四、代码实现

①后台代码(后台controller.java)

@RequestMapping("/addGoodsToCartList")

	//springMVC 的版本在 4.2 或以上版本,可以使用注解实现跨域
	@CrossOrigin(origins="http://localhost:9105",allowCredentials="true")
	
	public Result addGoodsToCartList(Long itemId, Integer num) {
	
		//-------------------设置响应头信息-------------------------
		
		//设置可以访问的域(当不用操作cookie时,添加下面第一句话就行)
		//注意:如果方法中不用操作cookie下面的地址可以写通配符“*”
		//response.setHeader("Access-Control-Allow-Origin", "http://localhost:9105");
		
		//设置允许携带凭证(当需要操作cookie时,需要再添加下面这句话)
		//response.setHeader("Access-Control-Allow-Credentials", "true"); 

			………………省略其它代码………………………………
}

②前端代码(前端controller.js)

	//添加商品到购物车
	$scope.addToCart=function(){
		//alert('skuid:'+$scope.sku.id);
		//跨域跳转页面
		$http.get('http://localhost:9107/cart/addGoodsToCartList.do?itemId='
				+$scope.sku.id+'&num='+$scope.num,{'withCredentials':true}).success(
						function(response){
							if (response.success) {
								location.href="http://localhost:9107/cart.html"
							}else{
								alert(response.message);
							}
						}
				);
		
	}
	注意:如果要跨域操作cookie,前端控制层也要声明{'withCredentials':true},允许cookie携带凭证
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

睡前来杯海飞丝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值