原文地址:http://blog.csdn.net/lovingprince/article/details/5984449web
首先,什麼是 P3P ( Platform for Privacy Preferences ),其實就是一種能夠提供我的隱私保護策略的平臺協議。網上去去找,說得更清楚,我就不羅嗦了,我只舉個實際例子讓你們有個認識。面試
例如 first.abc.com 這個頁面中使用 iframe( 或者 img 、 script 等等方式 ) 嵌入了一個 third.xyz.com 的頁面, first.abc.com 會設置一些 cookie 到用戶本地,例如 trackid, 因爲咱們瀏覽器直接訪問就是 first.abc.com ,因此這些 first.abc.com 設置的 cookie 能夠稱爲第一方 cookie ,而 third.xyz.com 也可能須要設置一些cookie 到本地,例如 uc1 什麼的,相對而言,這個 third.xyz.com 設置的 cookie 叫第三方 cookie( 不是本家 ) ,而在 iframe 等發出請求到 third.xyz.com 時,通常但願可以將本域名 (.xyz.com) 下的原有 cookie( 例如這裏他本身設置的 uc1) 帶上,不過不幸的是因爲某些瀏覽器用戶隱私保護設置問題,不會把 third.xyz.com 的cookie 發送出去,若是 third.xyz.com 須要依賴這些本地發送的 cookie ,那麼就會產生問題。跨域
瀏覽器也有本身相應的默認選項。那如何讓瀏覽器發送這些 cookie 呢?那就選擇 高級 -> 勾選自動覆蓋 cookie 處理。此時, third.xyz.com 的 cookie 就能夠發送出去了。瀏覽器
不過話說回來,不可能讓全部用戶都去設置本身的瀏覽器吧?那怎麼解決?那就是 P3P 的功能了,他提供給 web 服務器一個功能,制定一個策略 ,發表一個相似以下聲明說:請把 cookie 給我吧,我拿來只是看看,能夠幫助你提供更好的服務,絕對不透露給其餘人。 瀏覽器收到這個聲明後,會對比瀏覽器的設置,給用戶一個提示,讓用戶選擇是否發送 ( 固然,這個看瀏覽器若是處理的,通常來講看了聲明都沒有阻止 cookie 發送,有點奇怪的說 ) 。那麼如何設置 P3P 呢?一種方式是使用 P3P 策略文件,至關之複雜,看了後怕,有興趣本身去了解,另外一種方式就是直接在 response中設置 P3P Header 便可,具體怎麼設置,以及一些設置限制 請看 下面試驗出來的結果:服務器
一、 跟js 跨域不一樣,P3P 設置時只須要在任何同父域名的域名中header 設置一次便可生效,例如 xx.xyz.com 的域名response 中設置header 設置一次P3P ,和從yy.xyz.com 的response 中設置P3P header ,效果同樣,他們都有.xyz.com 的頂級域名,設置一次以後針對全部頂級域名xyz.com 的應用都有效。cookie
二、 上面說了P3P 的一個實際例子,能夠知道,應該是須要cookie 發送的一方設置P3P 頭,說明白一點,即first.abc.com 頁面iframe 了 first.xyz.com ,那麼應該在first.xyz.com 的response 中設置response Header( 記住是在第三方設置便可。)spa
三、 同一個頂級域名下,屢次設置P3P ,僅第一次有效。.net
四、 置header 時須要同時設置cookie ,這些設置的cookie 就被P3P 聲明瞭,後續均可以一直使用,沒有在這裏申明的cookie ,是被禁止被髮送的。orm
五、 接上面第4 點,若是是前面被P3P 聲明過的cookie ,例如t ,後面又被response 設置一次,可是此次卻沒有p3p 頭,其實至關於這個cookie t 的申明被取消了,那麼後續做爲第三方cookie 的 t ,就會被禁止,這點必定注意。blog
六、 對了,關鍵的忘記了,頭怎麼設置?相似 rundata.getResponse().addHeader("P3P","CP='CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR'"); 便可,不過其中的英文字符表明什麼意思,你們能夠去官方上看下。不作解釋了,下面提供幾個參考地址。
IE6: http://msdn.microsoft.com/en-us/library/ms537343.aspx#cookie_filtering
另外:下面附幾個 cookie 限制,因爲還有小版本的區別,這裏只是一個大概,不必定精確,具體個數,你們能夠在本身的瀏覽器上用 JS 循環寫 cookie 試一試。看下能保存多少
如下就是關於各瀏覽器之間對 cookie 的不一樣限制:
|
IE6.0 |
IE7.0/8.0 |
Opera |
FF |
Safari |
Chrome |
cookie 個數: |
每一個域爲 20個 |
每一個域爲 50 個 |
每一個域爲 30個 |
每一個域爲 50個 |
沒有個數限制 |
每一個域爲 53個 |
cookie 總大小: |
4K |
4K |
4K |
4K |
4K |
4K |
對於後面多寫的 cookie ,瀏覽器採用的替換策略也不一致, IE6 基本上是採用最近最少使用策略, ff 就是後面替換前面的。