产生跨域的原因
产生跨越的条件:
1、浏览器限制。
2、跨越请求。
3、发送XHR(XMLHttpRequest)请求。
三者合一起才会产生跨越。
发出去的请求Type是json不会有跨越问题。
产生跨越的条件:
1、浏览器限制。
2、跨越请求。
3、发送XHR(XMLHttpRequest)请求。
三者合一起才会产生跨越。
发出去的请求Type是json不会有跨越问题。
在浏览器里面,协议、域名、端口,任意一个不一样,就会产生跨域。
只要不是xhr{XMLHttpRequest}请求,浏览器都不会跨域拦截
为什么会发生AJAX跨域
1、浏览器限制
2、跨域
3、XHR(XMLHttpRequest)请求
AJAX跨域问题的原因
为什么发生Ajax跨域?
1、浏览器显示
2、访问的路径不是本地的
3、发送的请求是XMLHttprequest的请求
发生Ajax 跨域请求的原因
Ajax 跨域请求 限制原因:
3、XHR(XMLHttpRequest)请求:
测试: 新增加一个 <img>标签,重启启动后,由图可知,尽管新添加了一个 <img>标签,但是,浏览器所报的错误还是只有一个,而这一个便是之前的<a>标签的请求;而这是由于 <img> 和 <a> 两个请求发送时的 Type 不同,<img> 是json类型的,而<a>则是xhr类型的
Ajax 跨域请求 限制原因:
2、跨域:
由图中可知,server 和 client 的 port 端口是不同的,因此,浏览器检测到后认为其发生了跨域
Ajax 跨域请求 限制原因:
1、浏览器限制:
由图中可以知道,当发送请求时,尽管控制台报了跨域请求错误,但是IDE的服务器后台,依旧正常收到了请求,并打印相关 响应字段
Ajax 跨域请求 限制原因:
1、浏览器限制:
由截图可知,服务器的请求响应状态为200,这代表这客户端的请求被服务器正常的响应了,服务器后台是没有任何限制,而且正确处理 了;从侧面也就证明了是 浏览器进行了限制,从而报了错误给我们
总的来说, 跨域问题有3个原因: 浏览器的限制, 跨域, xhr(XMLHttpRequest) 请求; 这三个条件同时满足才会产生跨域安全问题
浏览器的限制
发生这个跨域问题不是因为后台不允许前台调用, 真正的原因是浏览器出于安全考虑, 当他发现你的请求是跨域的时候, 会对发送的请求进行校验, 如果校验不通过, 就会报跨域错误. 这个时候可能你的请求已经发送成功并且返回了数据, 但控制台报了一条跨域错误, 说明服务器后台式没有任何限制的, 是浏览器报的错; 说白了就是浏览器多管闲事, 而不是后台不允许
2. 跨域:发出去的请求不是本域的. 请求里面 协议, 域名, 端口任何一个不一样, 浏览器都会认为是跨域; 比如前台是localhost:8080端口, 请求的是localhost:8081端口 , 虽然域名相同, 但端口不一样, 所以跨域了
3. 发送的是 XHR(XMLHttpRequest) 请求 (也是最重要的原因); 只要发送的不是XHR请求, 比如jsonp请求, 就算是跨域, 浏览器也不会报跨域问题
跨域安全问题:
浏览器限制:浏览器对请求进行校验,校验不通过则报跨域安全问题;(此处,前端向后台的请求处理是成功的,后台正常打印数据,前端 console 也正常打印数据,但浏览器在处理时拒绝了展示)
跨域:在交互过程中,前台向后端发起请求,前台的ip、端口与后台的ip、端口存在任何一个不同的情况都会被认为是跨域;
XHR(XMLHttpRequest)请求:发送的请求类型不同,发出的请求Type 为 json 时不会有跨域的问题,而一般情况下,大都是 Type 为 xhr 的请求,所以存在跨域请求的问题
发生跨域问题的原因:
浏览器的限制,出于安全考虑。前台可以正常访问后台,浏览器多管闲事报跨域问题,但其实前台已经访问到后台了。
跨域,协议、域名、端口任何一个不一样浏览器就认为是跨域。
XHR(XMLHttpRequest)请求,因为ajax是XHR请求,浏览器就会捕捉跨域问题。
为什么会发生跨域问题?
1、浏览器限制;
2、跨域(域名,端口不一样都是跨域);
3、XHR(XMLHttpRequest请求);同时满足以上三个条件就会产生跨域。
解决跨域的方法
1,从浏览器出发,允许浏览器跨域。
思路:通过命令行修改浏览器启动参数,使得浏览器不进行跨域检查,从而允许跨域
方法:命令行参数启动浏览器后添加参数--disable-web-security
例:chrome --disable-web-security
--disabl-web-security参数的作用是禁止浏览器进行跨域检查
但是,这种方法有三个缺点:
1.每次启动浏览器都需要通过命令行启动,太过繁琐
2.该方法会导致安全性方面的问题
3.该方法是客户端方面的改动,在实际使用中,在每个客户端上都禁止浏览器进行跨域检查不太现实,所以实用性较低。
总的来说,该方法虽然可以解决跨域问题,但是价值不大。在实际项目中,主要对服务器端进行改动使得支持跨域。
2,从XHR(XMLHttpRequest)出发
(1)避免发生跨域。使用jsonp,由于jsonp请求是通过script的方式发送的(只有xhr的请求方式才有可能产生跨域问题),所以不会产生跨域问题。Spring MVC实现过程:前台使用ajax的get请求,将dataType设为“jsonp”;服务器创建一个类并继承抽象类AbstractJsonReponseBodyAdvice,最后注解@ControllerAdivece。使用jsonp的弊端,只能使用get方式请求,服务器需要改动代码,发送的不是xhr请求。
(2)产生跨域后解决。
从被调用方考虑,有三种情况,分别是服务器实现,nginx配置和apache配置。
服务器实现需要注意两种情况,简单请求和非简单请求。简单请求是先执行请求再验证,非简单请求是先验证再请求。
简单请求(比较常见):方法为get,head,post,请求header里面没有自定义头,Content-Type的值为以下几种 text/plain,multipart/form-data,application/x-www-form-urlencoded。
非简单请求(比较常见):put,delect方法的ajax请求,发送json格式的ajax请求,带自定义头的ajax请求。
简单请求处理方案:在响应头中添加
Access-Control-Allow-Origin=“允许跨域的url”,即跨省域时,请求头Origin的值,所以一般是获取Origin的值。
Access-Control-Allow-Method=“*”,允许的方法。
非简单请求处理方案:在相应头中添加
Access-Control-Allow-Origin=“允许跨域的url”,即跨域时,可以获取请求头Origin的值。
Access-Control-Allow-Method=“*”,允许的方法
Access-Control-Request-Headers=“Content-Type,自定义的header的key”。
带cookies的跨域解决:在响应头添加
Access-Control-Allow-Credentials,="true",允许使用cookies
ngnix配置:
跨域安全问题:
浏览器限制:浏览器对请求进行校验,校验不通过则报跨域安全问题;(此处,前端向后台的请求处理是成功的,后台正常打印数据,前端 console 也正常打印数据,但浏览器在处理时拒绝了展示)
跨域:在交互过程中,前台向后端发起请求,前台的ip、端口与后台的ip、端口存在任何一个不同的情况都会被认为是跨域;
XHR(XMLHttpRequest)请求:发送的请求类型不同,发出的请求Type 为 json 时不会有跨域的问题,而一般情况下,大都是 Type 为 xhr 的请求,所以存在跨域请求的问题
浏览器限制
跨域:协议,域名,端口,任何一个不一样就是跨域。
浏览器只对 XHR(XMLHttpRequest) 请求做跨域限制。
ajax跨域问题的原因:
只要是域名、端口、协议有任何一种不一样,即认为是跨域。
只有XHR请求才会有跨域问题,如果是json请求就算跨域,也不会报错。
浏览器跨域问题的三个原因:
浏览器验证
跨域
XHR(XMLHttpRequest)
发生跨域问题的原因:
浏览器的限制,出于安全考虑。前台可以正常访问后台,浏览器多管闲事报跨域问题,但其实前台已经访问到后台了。
跨域,协议、域名、端口任何一个不一样浏览器就认为是跨域。
XHR(XMLHttpRequest)请求,因为ajax是XHR请求,浏览器就会捕捉跨域问题。
三个条件同时满足才会产生跨域问题。
为什么会发生AJAX跨域问题?
1、浏览器限制
2、跨域
3、XHR(XMLHttpRequest)请求
发生ajax跨域
1、浏览器的限制
2、端口和域名不一致
3、发送的是XHR(XMLHttpRequest)请求
如果发送的是type是json也就不会出现跨域
发生ajax跨域问题的原因(要同时满足):
1.浏览器限制
2.跨域(发出去的请求不是本域的)
3.XHR(XMLHttpRequest)请求
一、为什么会发生ajax跨域:
1、浏览器限制;
2、跨域
3、XHR(XMLHttpRequest)请求。
二、$.ajax发送的请求类型是xhr请求,dataType:'json'的请求是预期服务器返回的数据的类型。
三、<img src="http://test_ajax/app/testController">发送的请求类型是json。