关于跨域的解决方案 & Cookie

深入浅出JSONP--解决ajax跨域问题   

./Google\ Chrome  --disable-web-security

 

chrome跨域设置

在chrome快捷方式,目标里如下设置

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-web-security

 

window.xdomain && xdomain.slaves 跨域解决方案:

Header set Access-Control-Allow-Origin "*"

Header set Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept, language, uniIdentifier"

 

什么是跨域?

简单的来说,出于安全方面的考虑,页面中的JavaScript无法访问其他服务器上的数据,即“同源策略”。而跨域就是通过某些手段来绕过同源策略限制,实现不同服务器之间通信的效果。

 

具体策略限制情况可看下表:

 

URL 说明 允许通信
http://www.a.com/a.js
http://www.a.com/b.js
同一域名下 允许
http://www.a.com/lab/a.js
http://www.a.com/script/b.js
同一域名下不同文件夹 允许
http://www.a.com:8000/a.js
http://www.a.com/b.js
同一域名,不同端口 不允许
http://www.a.com/a.js
https://www.a.com/b.js
同一域名,不同协议 不允许
http://www.a.com/a.js
http://127.0.0.100/b.js
域名和域名对应ip 不允许
http://www.a.com/a.js
http://script.a.com/b.js
主域相同,子域不同 不允许
http://www.a.com/a.js
http://a.com/b.js
同一域名,不同二级域名(同上) 不允许
http://www.a.com/a.js
http://www.b.com/b.js
不同域名 不允许

 

 

CORS 跨域:

Apache Configure CORS Headers for Whitelist Domains

<IfModule mod_headers.c>
   SetEnvIfNoCase Origin "https?://(www\.)?(domain\.com|staging\.domain\.com)(:\d+)?$" ACAO=$0
   Header set Access-Control-Allow-Origin %{ACAO}e env=ACAO
</IfModule>


* http://domain.com
* https://domain.com
* http://www.domain.com
* https://www.domain.com
* http://staging.domain.com
* https://staging.domain.com
* http://www.staging.domain.com
* https://www.staging.domain.com

 

// cross domain for test env.

101.*.*.253 domain.com   

172.18.64.34 www.domain.com

 

访问:[OK]

http://domain.com/s/wl/web/402/page/help/crossDomain.html?upenv=2   

http://www.domain.com:36080/s/wl/web/402/page/help/crossDomain.html?upenv=2

 

PS:

Here's a good Article about your Question: http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/

If that's not good enough or doesn't work either you need a Proxy like this:https://raw.github.com/cowboy/php-simple-proxy/master/ba-simple-proxy.php

Then you can call the Proxy with Parameters like: http://www.example.com/ba-simple-proxy.php?url=https://api.example.com

 

http://stackoverflow.com/questions/9631155/specify-multiple-subdomains-with-access-control-origin 

 

--------------------------------------------------------------------

 

本文目录:

   1. Cookie 来由

   2. Cookie 用途

   3. 生命周期

   4. Cookie 工作机制

   5. Cookie 操作方法

   6. Cookie几种读取区别

   7. Cookie 跨域

 

 

1. Cookie 来由

      进入互联网时代,大部分的应用都基于互联网,采用B/S模式或者B/S与C/S结合的方式处理。但是http协议是无状态的协议,一个应用可能需要记录用户的登录状态、操作行为等等,那么就需要一个令牌一样的东西,记录客户端机器的相应的数据,因而Cookie诞生了。

 

2. Cookie 用途

      Cookie 是浏览器提供的一种机制, cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。在机器上体现为一个文本文件,cookie机制将信息以一个文本文件形式存储于用户硬盘,因此可以作为全局变量,这是它最大的一个优点。它可以用于以下几种场合。
      1.    保留用户的登录状态
      2.    跟踪用户的行为,进行相应的统计分析
      3.    定制用户的应用界面
等等,Cookie使用场合太多了。在当前的互联网应用中,如果禁用了Cookie,那是不可想象的,几乎是寸步难行。    

 

3. 生命周期

      Cookie 变量虽然存放在Client 端机器上,却也不是永远不会消失的。可以通过Cookie 的过期时间来处理(以Java为例)。过期的时间类型为Int型值,

       -1:表示本session有效,即在本浏览器打开的周期内有效,浏览器关闭后Cookie也被删除

      >=0: 表示Cookie的有效器,以秒为单位设置cookie 最大的有效时间,明确值指定cookie 将在多少秒过后失效。注意,这个值是cookie 有效期满的最大值,不是当前cookie 的存在时间。

 

4. Cookie 工作机制

      Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件 内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,对于 JSP而言也可以直接写入jsessionid,这样服务器可以知道该用户是否合法用户以及是否需要重新登录等。

      其处理的步骤为:

      步骤一:在服务器端创建Cookie(客户端也是可以的,在服务端创建安全性高,这里以E网打进为例)

                 我们创建了一个名字为 COOKIE_EUP_TMP 的Cookie来包含访问者的信息,创建Cookie时设置:

 

Java代码  收藏代码
  1.              Cookie cookie = new Cookie("COOKIE_EUP_TMP", "cookieValue");  
  2.              cookie.setDomain("cn.alisoft.com");  
  3.              cookie.setPath("/");  
  4.              cookie.setMaxAge(-1);  
  5.              this.getResponse().addCookie(cookie);  

 

     注意: 在实际传递过程中这个Cookie的值是经过了URLEncode方法的URL编码操作的。 这个含有Cookie值的HTTP Header被保存到浏览器的Cookie文件后,Header就通知浏览器将Cookie通过请求以忽略路径的方式返回到服务器,
完成浏览器的认证操作。

 

     此外,我们使用了Cookie的一些属性来限定该Cookie的使用。例如:

 

         Domain属性:能够在浏览器端对Cookie发送进行限定,具体到上面的例子,该Cookie只能传达室到指定的服务器上,而决不会跑到其他的如www.hp.com的Web站点上去。

         Expires属性:则指定了该Cookie保存的时间期限,例如上面的Cookie在浏览器上只保存到1999年3月1日1秒。当然,如果浏览器上Cookie 太多,超过了系统所允许的范围,浏览器将自动对它进行删除。

         Path属性:用来指定Cookie将被发送到服务器的哪一个目录路径下。

 

     说明:浏览器创建了一个Cookie后,对于每一个针对该网站的请求,都会在Header中带着这个Cookie;不过,对于其他网站的请求Cookie是绝对不会跟着发送的。而且浏览器会这样一直发送,直到Cookie过期为止。

 

 

5. Cookie 操作方法

 

     java的写Cookie的方法:

 

Java代码  收藏代码
  1. Cookie cookie = new Cookie("COOKIE_EUP_TMP", "cookieValue");  
  2. cookie.setDomain("cn.alisoft.com");  
  3. cookie.setPath("/");  
  4. cookie.setMaxAge(-1);  
  5. this.getResponse().addCookie(cookie);  

    删除Cookie的方法:

        指定 maxAge = 0 即可

 

    PS:在实际的使用中,Cookie值需要经过加密进行处理的,而且不能存储过多的数据,否则会影响页面的浏览速度。在web应用中,一般把静态资源(JS,CSS,IMAGE)等资源和web应用的域名分开来处理,那么静态资源就不会带有Cookie,能极大的提高Web应用的浏览速度。

 

6. Cookie几种读取区别

 

    下面以cn.alisoft.com域名为例,用几个域名来验证test.cn.alisoft.com,cn.alisoft.com,alisoft.com三个父子域名的读取区别:

 

     步骤一、在域cn.alisoft.com 写入名称为:COOKIE_EUP_TMP 时效为:60*60 的Cookie

     步骤二、在域cn.alisoft.com 新开浏览器执行读取,可读到 COOKIE_EUP_TMP 值

                 在域test.cn.alisoft.com 新开浏览器执行读取,可读到 COOKIE_EUP_TMP 值

                 在域alisoft.com 新开浏览器执行读取,读不到 COOKIE_EUP_TMP 值

 

     另外我们增加Path的形式写入Cookie:

     步骤一、在域cn.alisoft.com 写入名称为:COOKIE_EUP_TMP Path:/home  时效为:60*60 的Cookie

     步骤二、在域cn.alisoft.com 新开浏览器执行读取,在home目录下,可读到 COOKIE_EUP_TMP 值

                 在域cn.alisoft.com 新开浏览器执行读取,在search目录下,读不到 COOKIE_EUP_TMP 值

 

     结论:子域名可读父域名写入的Cookie,反之不行。如果设置了Path特性,那么只有这个Path路径下可读。

 

posted @ 2015-04-19 11:20  jianhua_iphone  阅读(798)  评论(0)    收藏  举报