【问题标题】:cookie values disappear when traversing between content pages在内容页面之间遍历时 cookie 值消失
【发布时间】:2011-11-22 13:04:36
【问题描述】:

在我的应用程序中。有一个登录机制,可以保存一个包含刚刚登录用户信息的 cookie

     private void CreateCookie(LoginEventArgs args)
     {
         HttpCookie cookie = new HttpCookie("user");
         cookie.Values["name"] = args.User_Name;
         cookie.Values["id"] = args.ID;
         cookie.Expires = DateTime.Now.AddDays(1);            
         Response.Cookies.Add(cookie);
     }

在我的母版页加载时,我会检查此 cookie 是否存在:

   HttpCookie cookie = Request.Cookies["user"] ;
   if( (cookie != null) && (cookie.Value != ""))  
   {
        if (Session["user"] == null)
            Login_Passed(this, new LoginEventArgs(cookie.Values["name"].ToString(), int.Parse(cookie.Values["id"])));
   }

现在如果我登录(创建一个 cookie),关闭浏览器,然后运行我的应用程序。再次饼干 存在它的值是正确的,并且用户是“自动”登录的。

如果我首先从启动内容页面重定向到不同的内容页面 cookie 值也完好无损,

问题是当我第二次重定向回不同的内容页面时, 母版页加载,进行检查 cookie 存在,但值被删除...

关于为什么会发生这种情况的任何想法?

顺便说一句,我退出的方式可能是导致此问题的原因:

当我注销时,我会创建一个同名的 cookie,它会在 1 天前过期。

   private void Remove_Cookie()
   {
        HttpCookie cookie = new HttpCookie("user");
        cookie.Expires = DateTime.Now.AddDays(-1);
        Response.Cookies.Add(cookie); 
   }

在我描述的情况下,我没有正式注销,我只是结束了我的应用程序,所以这不应该 有什么效果。

【问题讨论】:

  • 你是否在你的开发者 IIS 上测试这个?
  • 我什至不知道那是什么..
  • 这就是在 Visual Studio 中调试时运行的 IIS 服务器。因为默认情况下它会向该服务器添加一个随机端口,并且您的 cookie 可能依赖于该 localhost:port 地址,因此请尝试在您的 Web 项目中设置一个固定端口。
  • 问题依然存在
  • 我认为问题是当我再次重定向时,执行不同的请求并删除最后一个请求的 cookie,有什么想法如何在请求之间保存 cookie?无需在母版页的每个 Page_Load 上重新创建 cookie。

标签: c# asp.net cookies


【解决方案1】:

好的,问题出乎意料
特别感谢 Peter Bromberg

http://www.eggheadcafe.com/tutorials/aspnet/198ce250-59da-4388-89e5-fce33d725aa7/aspnet-cookies-faq.aspx

在文章“消失的 Cookie”部分中

作者指出,如果您对 Response.Cookies["cookie_name"] 有关注 浏览器会创建一个新的空 cookie 来覆盖您的 cookie。

我使用了这样一块手表,它让我的 cookie 失去了它的价值,当我把它从 cookie 上取下来时,它保持了它的价值。

道德是不要看 Response.Cookies[" "] 我还在其他帖子中读到,如果您检查

 if( Response.Cookies["cookie_name"] != null    )  

例如,它也会被覆盖。

【讨论】:

  • 吸气剂有副作用?见鬼
  • 是的,据我所知,我检查了几次只是为了确定。
  • 老兄,这太疯狂了。这让我发疯了!谢谢!
  • 吉米脆玉米。这太疯狂了。
【解决方案2】:

重申并建立在已经陈述的内容(是的,我知道这是一个 4 年前的问题)我发现最好构建一个实用程序来处理这个问题 - 主要是因为我想经常检查那个特定的 cookie。

这不会触及响应,而只会从请求中读取。

    public static HttpCookie GetCookie(string cookieName)
    {
        HttpCookie rqstCookie = HttpContext.Current.Request.Cookies.Get(cookieName);
        /*** NOTE: it will not be on the Response!
         *   this will trigger the error noted in the original question and
         *   create a new, empty cookie which overrides it
         *   
            HttpCookie respCookie = HttpContext.Current.Response.Cookies.Get(cookieName);
         * 
         */
        if (rqstCookie != null && !String.IsNullOrEmpty(rqstCookie.Value))
        {
            // is found on the Request
            return rqstCookie;
        }
        else
        {
            return null;
        }
    }

经验法则

始终从请求中读取并写入响应。

感谢伊兰!这篇文章正是我所需要的

【讨论】:

  • 非常有用!对于使用 C# 6.0 及更高版本的任何人。可以使用以下行代替整个 if/else 语句。 return !string.IsNullOrEmpty(rqstCookie?.Value) ? rqstCookie : null;
【解决方案3】:

尝试以下方法:

  • 如果您在本地机器上开发,请将您的应用程序放在某个免费网页上,这样就不会因为您在本地主机上而受到“特殊待遇”。
  • 如果您已经在网络服务器上,并且重定向在两个不同的域之间,您可能需要在 google 搜索“同源策略”或阅读以下内容:http://en.wikipedia.org/wiki/Same_origin_policy(该文档讨论了 javascript ,但对于 cookie 也是如此)。

【讨论】:

  • 我正在本地机器上工作,请原谅我的无知,但是“免费网页”是什么意思
  • 我的意思是您不必为托管付费。因为在您开发时支付虚拟主机费用是浪费金钱。 (不幸的是,我不知道在哪里可以找到)您可以尝试的另一件事是使用不同的浏览器。
  • 问题是cookie是否假设在请求之间保持活动状态,当我再次重定向它的另一个请求时,但cookie仍然存储在我的机器上,所以它假设即使再次发送有另一个请求,我会在其他浏览器上尝试并通知您
  • 不同浏览器出现同样问题
【解决方案4】:

使用以下方法从 cookie 中获取值:

public string GetValueFromCookies(HttpCookieCollection cookies)
{
    if (cookies == null)
    {
        throw new ArgumentNullException(nameof(cookies));
    }

    // check the existence of key in the list first
    if (Array.IndexOf(cookies.AllKeys, key) < 0)
    {
        return null;
    }

    // because the following line adds a cookie with empty value if it's not there
    return cookies[key].Value;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-06
    • 2013-07-16
    • 2013-12-10
    • 2023-03-21
    • 2013-06-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多