知识小结:
1.跨域的问题不是服务器的问题,是浏览器不允许跨域 从而报错。
2.协议 ip 端口,只要其中一个前后端不同,浏览器都视为跨域。
3.只有X-Requested-With为XMLHttpRequest的情况下才会发生跨域的问题。 而$.get $.post $.ajax都是XMLHttpRequest的类型,所以产生跨域问题。getJsonP就是通过绕过这个类型来解决跨域的问题的。
4.Cookie跨域:不能由前端跨域设置,例如如果页面时127.0.0.1,无法再127.0.0.1的页面向localhost植入Cookie。只能在localhost本域注入Cookie,127.0.0.1可以跨域传输localhost的Cookie给后端(后端也是localhost域)。因此跨域Cookie的植入一般由后端完成。
解决方案
5.为了安全,建议由后端植入Cookie,并且设置为HttpOnly。以防止脚本操纵核心Cookie
6.非简单请求,会发送OPTIONS预检命令,看是否支持某些字段的修改,例如自定义Header,自定义Content-Type等。发送预检命令的时间由Access-Control-Max-Age来定,单位为秒。
跨域具体方案:
1. 让后台修改,支持某些前端域名的跨域。php代码如下:
header('Access-Control-Allow-Origin:*'); //支持所有前端域名,但是*有个问题,就是不支持Cookie的跨域
也可以动态设置跨域。header('Access-Control-Allow-Origin:'.$_SERVER['HTTP_ORIGIN']);//如果请求涉及到跨域,那么origin会自动带上前端域名信息。这样做还有一个好处,可以支持cookie跨域
2. jsonp。 讲get请求伪装成一个script文件的加载。就可以绕过跨域的问题为了。
缺点:需要后台做修改;只能用get方法;发出去的不是xhr请求;
jquery的jsonp底层实现原理如下: