19

我尝试在我的应用程序中实现一个基本的 cookie 助手。主要是我每次都检查基本控制器是否设置了 cookie。如果饼干

public class MyCookie
{

    public static string CookieName {get;set;}
    public virtual User User { get; set; }
    public virtual Application App { get; set; }


    public MyCookie(Application app)
    {
        CookieName = "MyCookie" + app;
        App = app;
    }

    public void SetCookie(User user)
    {
        HttpCookie myCookie = HttpContext.Current.Request.Cookies[CookieName] ?? new HttpCookie(CookieName);
        myCookie.Values["UserId"] = user.UserId.ToString();
        myCookie.Values["LastVisit"] = DateTime.Now.ToString();
        myCookie.Expires = DateTime.Now.AddDays(365);
        HttpContext.Current.Response.Cookies.Add(myCookie);
    }

    public HttpCookie GetCookie()
    {
        HttpCookie myCookie = HttpContext.Current.Request.Cookies[CookieName];
        if(myCookie != null)
        {
            int userId = Convert.ToInt32(myCookie.Values["UserId"]);
            User user = session.Get<User>(userId);
            return user;
        }
        return null;
    }
}

如果会话为空,我尝试从 cookie 中获取,或者如果会话初始化我设置了 cookie,但我从未在浏览器中看到我的 cookie。怎么了?

我总是启动会话,但使用 userId=0 获取 cookie 并从 cookie 设置会话:

if (userId == 0)
{
    MyCookie myCookie = new MyCookie(_app);
    User user = cookieHelper.GetCookie();
    if (user != null)
        SessionHelper.SetSession(user);
}
4

3 回答 3

19

您不能在同一个请求中设置和获取 cookie。获取 cookie 从浏览器获取,但尚未获取 - 设置 cookie 可以在请求完成时将其作为标头的一部分发回。

您需要设置 cookie 并让浏览器重定向到其他地方(例如从 /login 到 /account),然后在读取新请求时它会正确显示 cookie。

编辑:如果猜测是错误的,我还会质疑您实际调用 .SetCookie() 的位置,因为在您提供的代码中没有任何地方实际上是调用它来首先创建 cookie。

为了调试这些东西,我发现最好采用一些你认为应该工作的代码,测试它们。例如,在新页面的 page_load 中,我输入了这个:

string CookieName = "bob";
long UserId = 4;
HttpCookie myCookie = HttpContext.Current.Request.Cookies[CookieName] ?? new HttpCookie(CookieName);
myCookie.Values["UserId"] = UserId.ToString();
myCookie.Values["LastVisit"] = DateTime.Now.ToString();
myCookie.Expires = DateTime.Now.AddDays(365);
HttpContext.Current.Response.Cookies.Add(myCookie);

并且 cookie 正确显示没有问题。因此,知道此代码确实有效,我们可以假设错误是未调用函数,或者您当前正在进行的测试/调试是尝试在同一请求中设置和读取 cookie 并且失败(如我最初所述)

不管怎样,祝你好运!

于 2011-07-25T01:20:42.157 回答
14

我的工作实现(基础版)

public class CookieHelper
{

public static string CookieName {get;set;}
public virtual Application App { get; set; }


public MyCookie(Application app)
{
    CookieName = "MyCookie" + app;
}

public static void SetCookie(User user, Community community, int cookieExpireDate = 30)
{
    HttpCookie myCookie= new HttpCookie(CookieName);
    myCookie["UserId"] = user.UserId.ToString();
    myCookie.Expires = DateTime.Now.AddDays(cookieExpireDate);
    HttpContext.Current.Response.Cookies.Add(myCookie);
 }
 }

如果会话/cookie 为空(实际上 userid=0)

if (userId == 0){
    CookieHelper myCookie = new Cookie(_app);
    if (myCookie  != null)
    {
        userId = Convert.ToInt32(System.Web.HttpContext.Current.Request.Cookies[myCookie.CookieName]["userId"]);
        if(userId>0)
        {
           SessionHelper.SetSession(userId);
        }
    }
}
于 2011-07-29T20:15:14.787 回答
1

试试这个

HttpCookie cookie = new HttpCookie("Remember_Me");
cookie["userID"] = Userid.ToString();
cookie.Expires = DateTime.Now.AddMonths(3);
Response.Cookies.Add(cookie);
于 2017-07-04T08:33:47.450 回答