CP="CAO PSA OUR" 用P3P header解決iframe跨域訪問cookie

一、IE瀏覽器iframe跨域丟失Session問題html

在開發中,咱們常常會遇到使用Frame來工做,並且有時是爲了跟其餘網站集成,應用到多域的狀況下,而Iframe是不能保存Session的所以,網上能夠找到不少相關的文章,若是網站能夠採用設置Web.Config中的配置: mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="40"
/>
把cookieless="false"改爲"true"就能夠了但也一樣有個小問題,就是若是頁面中採用Javascript的window.location.href=''這樣的方式來重定向的話,系統會認爲這是另外一個新的請求,產生一個新的SessionId,致使原Session一樣的丟失因此對於重定向,仍是使用Response.Redirect()爲好java

除了Ifrmae有丟Session問題外,frameset也有一樣的問題Frameset的問題更不肯定,是有時會丟,有時不會丟,這更認人頭痛,在網上找到了一個方法,在頁面page_onload裏添加一語句:
Response.AddHeader("P3P","CP=CAO PSA OUR");
FrameSet中的Session丟失問題就解決了至於裏面具體的緣由 也沒時間去搞懂了sql

最簡單的方法就是在iis裏設置跨域

解決辦法瀏覽器

response.addHeader("P3P","CP=CAO PSA OUR")。安全

不過難道咱們須要在每一個頁面都加這個麼?服務器

不須要的cookie

若是有權配置IIS服務器session

打開IISapp

管理工具——〉選擇一個網站——〉屬性——〉http頭,增長一個http頭
而後輸入頭名:P3P
輸入頭內容:CP=CAO PSA OUR

若是沒有權限配置IIS服務器,可是你用的是asp.net的話

能夠用httpmodual來實如今所有頁面或者部分頁面頭部插入所須要的標誌

本站點的某個目錄就是這樣實現的

二、用P3P header解決iframe跨域訪問cookie

本文來源:http://blog.csdn.net/wonder4/archive/2008/02/27/2125804.aspx

目前在整合幾個應用時,遇到了iframe沒法獲取cookie(session)的問題,通過google,終於把這個問題解決了,如今記錄一下。
   個人需求是這樣的。
   有一個應用是用.net開發的,主要是控制用戶登陸,用戶訪問權限的,部署在上海機房。如今就叫A應用吧
   還有一個應用是用java開發,主要是具體業務的操做。部署在北京機房,這裏叫B應用吧
   因爲已經有一個用戶管理和權限的應用程序,因此java 開發的這個B應用就沒有開發用戶權限的功能,想直接使用.net的A程序。

用戶訪問的流程是這樣的:
    1.用戶先在A處登陸,A設本身的cookie,在A的菜單裏有去B應用的連接
    2.當用戶點去B應用的連接時,A在連接上自動加上這個用戶的token,傳給B系統
3.當B系統接收到請求後,把這個用戶的token信息設成本身系統的cookie,(B系統裏有表單post操做,若是不設cookie,session,那麼每一個請求無論GET仍是POST都要明確帶着該用戶的token信息,對於系統的改造量比較大,另外之後換權限驗證方法改動也比較大。)
4.用戶在B系統裏的每次操做都沒有明碼帶用戶的token,因此每次都要去cookie獲得token信息,而後發送一個http請求去A,讓A系統驗證這個用戶是否有權限訪問。
    5.若是A系統的接口返回能夠訪問的狀態報告,那麼B繼續執行;若是A系統指示沒有權限訪問,那麼B系統提示訪問受控警告信息。

一切開發都完成,到整合上線時,發現這個流程走不通,百思不得其解,想了半天也不知道 怎麼 回事,google了半天,才發現原來是ie在搗鬼,IE不容許跨域訪問cookie(好象firefox沒問題,ie自6.0之後改用w3c組織的P3P協議了),再看看個人應用,在第二步設的cookie,在第三步之後全部B應用的訪問請求,ie都把B應用的cookie blocked掉了(由於用戶的訪問是從A應用發起,從A應用訪問B應用的東東,算跨域訪問,IE認爲有安全問題)。。。。(IE狀態欄有一個紅眼睛的button,點開能夠看到哪些cookie給blocked掉了)

     知道緣由就好辦了,再google知道能夠用P3P header能夠解決問題!
     下面是java的解決辦法之一,也是個人解決辦法,不過個方法不太好:
     直接往響應里加一個P3P的header
     response().addHeader("P3P", "CP=\"IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA\"");

其中CP=「XXX XXXX」這些是有具體含義的:
     CP就是compact policies的意思,
    另外header的值也能夠是policyref="http://myhost/P3P/PolicyReferences.xml",就是指定一個策略文件。

具體請看這裏.

下面是摘抄的一段Compact Policies的具體取值範圍和設值含義。
Compact Policies
Compact policies are essentially summaries of P3P policies. They can be used by user agents to quickly get approximate information about P3P policies, therefore improving performance.

For an in-depth explanation of compact policies, we refer to the P3P1.0[4] specification. Here, we limit to stating the syntax:

compact-policy-field  = `CP="` compact-policy `"`

compact-policy        = compact-token *(" " compact-token)

compact-token         =  compact-access           |

                                 compact-disputes         |

                                   compact-remedies         |

                      compact-non-identifiable |

                       compact-purpose          |

                         compact-recipient        |

                       compact-retention        |

                       compact-categories       |

                        compact-test compact-access        = "NOI" | "ALL" | "CAO" | "IDC" | "OTI" | "NON"

                        compact-disputes      = "DSP"

                        compact-remedies      = "COR" | "MON" | "LAW"

                        compact-non-identifiable = "NID"

                        compact-purpose       = "CUR"        | "ADM" [creq] | "DEV" [creq] | "TAI" [creq] |

                         "PSA" [creq] | "PSD" [creq] | "IVA" [creq] | "IVD" [creq] |

                         "CON" [creq] | "HIS" [creq] | "TEL" [creq] | "OTP" [creq]                       

                           creq                  = "a" | "i" | "o"

                        compact-recipient     = "OUR" | "DEL" [creq] | "SAM" [creq] | "UNR" [creq] |

                                                             "PUB" [creq] | "OTR" [creq]

                        compact-retention     = "NOR" | "STP" | "LEG" | "BUS" | "IND"

                        compact-category      = "PHY" | "ONL" | "UNI" | "PUR" | "FIN" | "COM" |

                                                            "NAV" | "INT" | "DEM" | "CNT" | "STA" | "POL" |

                                                             "HEA" | "PRE" | "LOC" | "GOV" | "OTC"

                        compact-test          = "TST"

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/wonder4/archive/2008/02/27/2125804.aspx

"TST"另外這裏還有一個P3P的驗證工具:http://www.w3.org/P3P/validator.html,能夠驗證一下本身設置的P3P是否正確。這裏還有一個老外寫的不錯的blog,也能夠參考一下。http://www.sitepoint.com/article/p3p-cookies-ie6/2

相關文章
相關標籤/搜索