如何在domain.com和www.domain.com之间共享cookie
本文关键字:domain com 之间 共享 cookie www | 更新日期: 2023-09-27 18:29:10
我正在使用HttpWebRequest从网站下载数据,我注意到一个与cookie有关的错误。当你从domain.com获取数据,而该网站重定向到www.domain.com并发送cookie时,该cookie不会与domain.com共享。这会在我的应用程序中导致一些严重的错误。
我知道www.domain.com不一定是domain.com的同一个网站,但我相信在这种情况下,收益将超过任何相关风险。
有没有什么简单的方法可以自动将cookie从domain.com应用到www.domain.com,反之亦然?
将cookie内容存储在会话对象中,并使用标识会话对象的会话密钥调用新页面。然后在为www.domain.com交付页面时查找会话并设置新的cookie。
以下是我所做的:
class DomainComparer : StringComparer
{
public override int Compare(string x, string y)
{
if (x == null || y == null)
{
return StringComparer.OrdinalIgnoreCase.Compare(x, y);
}
if (x.StartsWith("www.", StringComparison.OrdinalIgnoreCase))
{
x = x.Substring(4);
}
if (y.StartsWith("www.", StringComparison.OrdinalIgnoreCase))
{
y = y.Substring(4);
}
return StringComparer.OrdinalIgnoreCase.Compare(x, y);
}
public override bool Equals(string x, string y)
{
return Compare(x, y) == 0;
}
public override int GetHashCode(string obj)
{
if (obj.StartsWith("www.", StringComparison.OrdinalIgnoreCase))
{
obj = obj.Substring(4);
}
return StringComparer.OrdinalIgnoreCase.GetHashCode(obj);
}
}
/// <summary>
/// this is a hackfix for microsoft bug, where cookies are not shared between www.domain.com and domain.com
/// </summary>
/// <param name="cc"></param>
static void ImproveCookieContainer(CookieContainer cc)
{
Hashtable table = (Hashtable)cc.GetType().InvokeMember(
"m_domainTable",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance,
null, cc, new object[] { });
var comparerPreperty = table.GetType().GetField("_keycomparer",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance);
if (comparerPreperty != null)
{
comparerPreperty.SetValue(table, new DomainComparer());
}
}