2012-08-09 93 views
6

我在將ASP.NET中的Cookie傳遞到新URL時遇到問題。我加餅乾,像這樣的迴應:在ASP.NET中的Response.Redirect中傳遞Cookie

Response.Cookies.Add(new HttpCookie("Username", Username.Text)); 

我再發出重定向:

Response.Redirect(returnURL);

上,我重定向到新的頁面,Cookie集合是空的。我嘗試檢索一個cookie,像這樣:

Request.Cookies["Username"].Value;

誰能想到,爲什麼沒有被傳遞的餅乾?

編輯:

更多的信息,我忘了補充 - 在同一個瀏覽器會話中的第二次嘗試,餅乾與重定向正確地傳遞。編輯#2:我發現,如果我使用「本地主機」而不是重定向網址中的實際域名,那麼在第一次登錄時cookie會正確傳遞。所以它只有當重定向網址是不起作用的實際域名時。奇怪。

+2

這與此問題類似http://stackoverflow.com/q/5366635/52136 – 2012-08-09 14:14:51

+0

謝謝,但這發生在我身上的IE9,FF,Chrome和Safari瀏覽器。 另外,我剛剛添加了一些我最初忘記添加的信息。 – tuseau 2012-08-09 14:18:05

+0

[在302重定向過程中發送瀏覽器cookie]的可能重複(https://stackoverflow.com/questions/4694089/sending-browser-cookies-during-a-302-redirect) – 2017-10-02 12:16:45

回答

2
protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     if (Request.QueryString["AcceptsCookies"] == null) 
     { 
      Response.Cookies["TestCookie"].Value = "ok"; 
      Response.Cookies["TestCookie"].Expires = 
       DateTime.Now.AddMinutes(1); 
      Response.Redirect("TestForCookies.aspx?redirect=" + 
       Server.UrlEncode(Request.Url.ToString())); 
     } 
     else 
     { 
      Label1.Text = "Accept cookies = " + 
       Server.UrlEncode(
       Request.QueryString["AcceptsCookies"]); 
     } 
    } 
} 

This link將幫助您瞭解如何在C#中讀寫Cookie。

此外,this page將是有用的,如果你熟悉VB多於C#。

3

瀏覽器只會將cookie發送回與設置cookie的頁面相同的域中的頁面。

所以,如果你去​​頁面與服務器然後繼續請求第二個URL,因爲它不是在何時設置cookie和重定向到(例如)http://mymachinename/default.aspx,cookie將無法從瀏覽器向服務器發送同一個域名。

要取回cookie,您必須重定向到http://localhost/default.aspx,否則您必須首先轉到http://mymachinename/login.aspx

3

根據HTTP State Management Mechanism

原始服務器可發送的Set-Cookie響應頭與任何
響應。用戶代理可能會忽略包含在
響應中的Set-Cookie頭,其中包含100個其他響應(包括400-
和500級別狀態碼的響應)中包含的頭部,但必須處理Set-Cookie
。原始服務器可以在單個響應中包含多個
Set-Cookie標題字段。 Cookie或Set-Cookie標頭字段的存在不排除HTTP高速緩存
存儲和重新使用響應。

因此REDIRECTs(3xx)在'其他'響應中,所以它們應該被瀏覽器處理,然後可能由於各種原因而丟棄它們。瀏覽器拒絕cookie的一個原因是,cookie的domain屬性被指定並且沒有足夠的點(如'localhost'),或者cookie的path屬性與URL中的實際路徑不匹配時(Cookie的路徑區分大小寫)。

0

通常我讓我的服務器產生一個Base64字符串,我通過ajax檢索。當準備好的對象可用時,我將從客戶端上的基礎字符串64開始創建「附件」。這樣,我可以在整個瀏覽器中一致地響應下載完成。