首页 > 代码库 > 跨域解决方式
跨域解决方式
1. 跨域
废话不多说,就是为了解决同源策略的苛刻,直接说解决方式jsop和cors两种方式
jsop是大家用的比较多也是最常见的一种,简单说下原理:
利用script标签的方式向不同的域下发送请求。首先动态的创建script标签,其src属性是没有跨域限制的,将请求的路径赋给src,type="text/javascript",这样就会一段执行之后就会将结果返回一段js代码,那么就在客户端注册一个callback方法(如:jsonCallback)。那么服务器端在返回这段内容的时候就会包裹上jsonCallback(....),客户端就会自动执行这个方法。正式由于这种方式是利用的script标签,因此也就注定了他的局限性,只能解决get请求。
同样的还可利用<image src>标签来实现
那么对于现在比较流行的restfull风格的POST,PUT,DELETE等方式就束手无策了吗,不是的,还有一种方式是cors策略
这种方式主要是服务器端进行操作,Access-Control-Allow-Origin: | * // 授权的源控制 Access-Control-Max-Age: // 授权的时间 Access-Control-Allow-Credentials: true | false // 控制是否开启与Ajax的Cookie提交方式 Access-Control-Allow-Methods: [, ]* // 允许请求的HTTP Method Access-Control-Allow-Headers: [, ]* // 控制哪些header能发送真正的请求 但是通常情况下CORS这种方式是不会传递cookie的,一般浏览器强制将cookie添加到header的做法,也会被浏览器拒绝并报错,上面提到的Access-Control-Allow-Credentials来控制是否允许cookie提交。因此需要在angular中进行设置withCredentials:true,或者ajax中xhrFiled:{withCredentials:true},crossDomain:true.
http://www.nowamagic.net/librarys/veda/detail/224/
http://m.baidu.com/from=1000953b/bd_page_type=1/ssid=0/uid=0/pu=usm%400%2Csz%401320_1002%2Cta%40iphone_2_4.4_2_6.6/baiduid=22401C7F9575A7067885D4D601B5BE21/w=0_10_angular+js+withCredentials/t=iphone/l=3/tc?ref=www_iphone&lid=10531186519244395428&order=5&vit=osres&tj=www_normal_5_0_10_title&m=8&srd=1&cltj=cloud_title&dict=20&nt=wnor&title=AngularJS%E9%80%9A%E8%BF%87CORS%E5%AE%9E%E7%8E%B0%E8%B7%A8%E5%9F%9F%E6%96%B9%E6%A1%88_Linux%E7%BC%96%E7%A8%8B_Linux%E5%85%AC%E7%A4%BE-...&sec=13199&di=c74effd91bf44476&bdenc=1&tch=124.47.45.812.0.0&tch=124.443.75.830.1.345&nsrc=http://www.mamicode.com/IlPT2AEptyoA_yixCFOxXnANedT62v3IEQGG_yJR0CumpEm9xP4kHREsRFv7Lmq3ZpPPdj0PtQIFuGGdWWUm8BN0t0IwdzW&eqid=92264a57b6f1d00010000001576b2157&wd=&clk_info=%7B%22srcid%22%3A%22www_normal%22%2C%22tplname%22%3A%22www_normal%22%2C%22t%22%3A1466638814270%2C%22xpath%22%3A%22div-a-h3%22%7D 这是两篇对我帮助比较大的文章。 哈哈!截至到现在关于跨域的解决方式算是完成了。但还是遇到了其他的问题
2. Cookie
原因是这样的,我在进行ajax请求的时候,服务器端通过response.header set-cookie通知浏览器生成cookie文件,涉及到登陆我需要将cookie信息传递过去,可是我就在我自己的域下面怎么也找不到相应的cookie。原来cookie默认是设置在请求的域底下的,所以他是在我的ajax中的请求域名底下存在。搜戴斯乃,终于思路撸通了。
跨域解决方式