1、问题描述:
首先在后台实现一个get1的响应,然后在本地浏览器访问,如图所示:
然后再启动一个服务,端口设为8081,然后在本地浏览器访问此IP,如果在此IP里访问端口为8080的IP时,会出现跨域问题,如图所示:
2、产生跨域问题的原因:
1)浏览器限制。跨域的根本原因在于浏览器在前台做的限制。
2)跨域。包括协议、域名和端口。
3)发送的是xhr(XMLHTTPRequest)请求。
三个条件缺一不可
3、解决思路:
- 浏览器禁止检查(意义不大)
- 不发送xhr,可以发送json
- 实现跨域,即对于浏览器来说,看起来没有跨域
4、跨域的实现
1)在浏览器启动的时候附加参数,–disable-web-security
chrome --disable-web-security --user-data-dir=f:\temp
2)jsonp:json for padding,在发送请求的时候,指定数据类型为jsonp,如果服务器端有callback标记,就会返回script类型文件,底层是在响应请求的时候,在html中创建script标签。至于callback标记,仅仅是一种约定,是可替换的。比如可以替换成callback2,此时要在发送请求时,指定jsonp属性为callback2。
发送xhr请求,会响应json数据类型;发送jsonp请求,会响应script数据类型。
jsonp实现跨域的弊端:
- 服务器端需要代码支持
- 只支持Get请求
- 发送的不是xhr请求
3)跨域解决方向
- 被调用方解决跨域
修改被调用方后台代码 - 调用方解决跨域
修改调用方后台代码
被调用方解决跨域方法:
1)修改应用服务器端代码,添加响应头的属性。
Access-Control-Allow-Methods: Get
Access-control-Allow-origin: http://localhost:8081
注意: * 表示允许所有的跨域
简单请求:方法为get、post、head
非简单请求:发送json格式的ajax请求
浏览器中添加cookie的方式:
document.cookie="xxx=xxx"
2)配置Nginx或者Apache,在http服务器中修改响应头。
调用方解决跨域方法:
隐藏跨域,通过调用方和被调用方http服务器的反向代理,即配置Nginx或者Apache。下面是Nginx配置文件。
server{
listen 80;
server_name a.com
location /{
proxy_pass http://localhost:8081;
}
location /ajaxserver{
proxy_pass http://localhost:8080/test
}
}