13、代理模式
代理模式:由于一个对象不能直接引用另一个对象,所以需要通过代理对象在这两个对象之间起到中介的作用。
由于用户相册模块上传的图片照片量越来越大,导致服务器端需要将图片上传模块重新部署到另外一个域(另外一台服务器),这样对前端来说,用户上传图片的请求路径发生变化,指向其他服务器,这就导致跨域问题。
1 // 当前 域名wwww.xx.com 2 $.ajax({ 3 url : 'http://upload.xx.com/upload/php', 4 success : function(res){ 5 //无法获得返回数据 6 } 7 });
打开控制台,你会发现报错了,出现跨域问题了
//浏览器控制台报错 xmlhttprequest cannot load http://upload.xx.com/upload/upload.php, no 'access-controll-allow-origin' header is present on the requested resource.
13.1跨越事项
跨域 : javascript 对安全访问因素的考虑,不允许跨域调用其他域名
比如: http:// www.baidu.com ,淘宝域名 http://www.taobao.com 不同域下的页面是不能直接访问的。百度域名和淘宝域名不能互相访问,这也是js 中因同源策略所定义的限制,不过近有这还不够,js 还对同一个域下不同端口号、同一域名不同协议、域名和域名对应的ip、 主域与子域、子域与子域等做了限制,都不能直接调用。如下 :
1 // 同一个域名不同端口号 如:http://www.baidu.com:8001 与 http://www.baidu.com:8002 2 // 同一个域名不同协议 https://www.baidu.com 与 http://www.baidu.com 3 // 域名与域名对应的ip http://www.baidu.com 与 http://61.135.169.125 4 // 主域 与子域名 http://www.baidu.com 与 http://b.a.com 5 // 子域 与 子域 http://xxx.baidu.com 与 bbb.baidu.com
这么多限制。
13.2 JSONP
1 $.ajax({ 2 async:false, 3 url: http://跨域的dns/document!searchJSONResult.action, 4 type: "GET", 5 dataType: 'jsonp', 6 jsonp: 'jsoncallback', 7 data: qsData, 8 timeout: 5000, 9 beforeSend: function(){} 10 //jsonp 方式此方法不被触发.原因可能是dataType如果指定为jsonp的话,就已经不是ajax事件了 11 });
服务器端
1 echo $_GET["callback"] . "({\"reqUrl\": reqUrl });";
jsonp 理解河上的小船,小船要将请求发送到对面,然后对面的人将数据发到小船上返回。
集中跨域方式:
script src/img src \ iframe \ action(表单)\ domain