1. 程式人生 > >跨域讀取Cookie和session之HttpWebRequest另類方法(網站API開發)

跨域讀取Cookie和session之HttpWebRequest另類方法(網站API開發)

在網上找了很多跨域讀取Cookie的方法,但都是A域主動設定B域的Cookie,而沒有B域去獲取A域Cookie的方法。

若要轉載,請註名出處 http://blog.csdn.net/try530/archive/2009/01/06/3721525.aspx

所謂A域主動設定B域的Cookie

1:在B.com上新建一檔案:SetCookie.aspx

  1. protected void  Page_Load( object  sender, EventArgs e)
  2.         {
  3.             HttpContext.Current.Response.AddHeader(
    "p3p" "CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR" );
  4.             HttpCookie cookie =  new  HttpCookie( "userid" "44" );
  5.             cookie.Domain =  ".b.com" ;
  6. //  cookie.Expires = DateTime.Now.AddSeconds((double)expires);
  7.             HttpContext.Current.Response.AppendCookie(cookie);
  8.         }

2:在A域新建一檔案:Default.aspx,在前臺頁面呼叫B域的SetCookie.aspx頁面,來為B域設定相應的Cookie.

  1.     <script src= "http://www.b.com/SetCookie.aspx" ></script>

3:在B域新建一檔案:Default.aspx來顯示被A域設定的Cookie。

  1. protected void  Page_Load( object  sender, EventArgs e)
  2.     {
  3.         Response.Write(Request.Cookies[
    "userid" ] ==  null  ?  ""  : Request.Cookies[ "userid" ].Value.ToString());
  4.     }

4:以此訪問www.a.com/default.aspx---->www.b.com/default.aspx

以上為A域主動設定B域的Cookie,適用於單點登入,但必須在B域,C域或D域上新建setcookie.aspx檔案來讓A域幫忙設定Cookie。

那B域C域或D域如何根據自身的需要去主動獲取A域的Cookie呢?請看以下方法,以下方法為此文重點。

1:在A域新建一檔案:SetCookie.aspx,此檔案用來設定A域自己的Cookie。

  1. protected void  Page_Load( object  sender, EventArgs e)
  2.         {
  3.             HttpCookie cookie =  new  HttpCookie( "userid" "44" );
  4.             HttpContext.Current.Response.AppendCookie(cookie);
  5.         }

2:A域的Cookie設定完了,那怎麼讓其他域來讀取自己的Cookie呢,這就是重點了。
新建一頁面:OpenID.aspx,用來讓B域讀取Cookie,並自動設定B域的cookie。(這裡有點昏)

  1. protected void  Page_Load( object  sender, EventArgs e)
  2.     {
  3.         HttpContext.Current.Response.AddHeader( "p3p" "CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR" );
  4. if  (Request.Cookies[ "userid" ] !=  null )
  5.         {
  6.             Response.Write(@"
  7.             var userid= " + Request.Cookies[" userid "].Value.ToString() + @" ;
  8.             SetCookie( 'userid' ,userid);//什麼域呼叫此檔案,設定的Cookie將是什麼域的。
  9.             window.location.href=document.URL;
  10.                  function SetCookie(name,value) //兩個引數,一個是cookie的名子,一個是值
  11.                 {
  12.                    document.cookie = name +  "" = "" + escape (value) ;
  13.                  }
  14.             ");
  15.         }
  16. else
  17.         {
  18.             Response.Write( "document.write('沒有cookie');" );
  19.         }
  20.     }


3:A域的工作已經完了,那B域如何得到A域的這個Cookie值呢,在B域新建一頁:default.aspx
  1. protected void  Page_Load( object  sender, EventArgs e)
  2.         {
  3. if  (HttpContext.Current.Request.Cookies[ "userid" ] !=  null )
  4.             {
  5.                 Label1.Text = HttpContext.Current.Request.Cookies[ "userid" ].Value.ToString();
  6.             }
  7. else
  8.             {
  9.                 Response.Write( " <script src=/"http://www.a.com/openid.aspx/"></script>" );
  10.             }
  11.         }

4:依次訪問 www.a.com/setcookie.aspx ------> www.b.com/default.aspx    此方法用於A域開發API給其他域呼叫。主要用於A域API介面的開發。就像現在的SNS網站提供當前登入的使用者資訊給其他應用程式(如搶車位)一樣,不過我不知道他們是怎麼實現的,但我用此方法實現了。
總結下此方法的步驟:
1:A域設定cookie
2:B域用呼叫javascript指令碼的方式讀取A域cookie,讀取後,並同步設定B域Cookie.
3:呼叫B域時,發現沒有cookie就自動從A域獲取cookie值來設定自己的Cookie。
A域可以把怎麼讀取的方法做成dll,提供給其他域。這稱之為A域的API。

測試成功,用此方法能跨域讀取session,方式是:把A域的Session值存入B域的cookie中。至於怎麼存,存在什麼cookie名稱裡,由A域提供。