2012-08-09 97 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开始创建“附件”。这样,我可以在整个浏览器中一致地响应下载完成。