Cookie更新而不是添加

时间:2013-10-28 14:48:11

标签: c# asp.net asp.net-mvc asp.net-mvc-4 cookies

我正在研究我的MVC项目中的投票机制应用程序,我要求允许用户在浏览器中只投票一次,如果他在同一个浏览器中第二次到达投票页面他不应该能够投票,但如果在另一个浏览器中他登录,他应该能够再次投票。

为此,我使用了Cookie来处理这种情况。我做的是我已经将UserID添加到cookie中,并且在View页面中我正在检查是否可以看到投票按钮。

我的观点是

@if ((ViewData["CookieData"] == null) || (ViewData["CookieData"].ToString() != Session["LoginPersonID"].ToString()))
{    
        <button name="button" value="Insert" onclick="return confirm('Are you sure you want to submit your choices ?.');">Vote Now!!</button>
        <br />  
        @Html.ActionLink("Back to Home Page", "EmployeeHomePage", "Employee", new { logedinperson = Session["LoginPersonID"] }, null);
}

和我的控制器是

public void AddCookie()
{            
    HttpCookie MyCookie = new HttpCookie("MyCookie", Session["LoginPersonID"].ToString());           
    MyCookie.Expires = DateTime.Now.AddDays(30);           
    Response.Cookies.Add(MyCookie);
    ViewData["CookieData"] = MyCookieCollection;       
}

当第一位用户说人员登录Firefox并投票时,他的personid存储在cookie中,所以如果他再次尝试进入投票页面,投票按钮将不可见,但随后他尝试在Google Chrome上打开他可以然后投票。这也是按预期工作的。现在当PersonB登录Firefox并投票时他的personid在cookie中更新,所以他也不能在同一个浏览器中第二次投票。

但我的确切问题是,当PersonA再次登录到Firefox时,他能够投票,因为cookie已经使用PersonB的id进行了更新。无论如何,如果他们已经在浏览器中投票,我怎么能限制PersonA和PersonB。

3 个答案:

答案 0 :(得分:1)

我看到的一个问题是您从未从请求中读取过cookie。您的控制器始终创建cookie并将其与响应一起发回。相反,您应首先检查cookie是否存在然后采取相应行动。

另一方面是,如果您希望cookie是每个帐户,您需要为每个帐户创建一个不同的cookie(即根据用户标识或用户名构建cookie名称),或者将所有ID /用户名存储在cookie,然后检查每一个。

答案 1 :(得分:0)

想法

将这两个ID存储在一个cookie中。当cookie是ID列表(例如以逗号分隔)时,它可以对多个人持有投票限制。您必须检查尝试投票的人不在列表中。

当然,这只能假设没有ID包含所选的分隔符,在本例中为逗号。如果不是这种情况,请选择管道或满足此属性的任何字符。

Algoritm

Cookie机制旨在存储键值对。键和值都是字符串。如果要在cookie中存储以逗号分隔的ID列表,则必须使用逗号作为分隔符(String.join(",", ids))将它们连接起来。首先读取cookie的原始值,用逗号分隔,然后添加新ID(如果还没有),然后加入列表并更新cookie。

实施

public void AddCookie() {
    HttpCookie MyCookie = new HttpCookie("MyCookie");
    var userName = Session["LoginPersonID"].ToString();
    var originalCookieContents = ViewData["CookieData"].ToString();
    var ids = new HashSet<String>(originalCookieContents.Split(','));
    ids.Add(userName);
    MyCookie.Value = String.Join(",", ids);
    MyCookie.Expires = DateTime.Now.AddDays(30);
    Response.Cookies.Add(MyCookie);
    ViewData["CookieData"] = MyCookie.Value;
}

不要忘记相应地更新您的视图代码!构建HashSet ID并使用其Contains方法。

答案 2 :(得分:0)

问题是在命名cookie时不区分用户。每个用户应该有一个cookie,或者您应该在该单个cookie中构建一个用户列表 - 但请记住,cookie的大小限制为4K。

所以如果你改变了行

HttpCookie MyCookie = new HttpCookie("MyCookie",
                      Session["LoginPersonID"].ToString()); 

这样的事情

var userName = Session["LoginPersonID"].ToString();
HttpCookie MyCookie = new HttpCookie("MyCookie-" + userName,
                      "Voted"); 

然后它应该工作(记住你还必须修改读取cookie的代码)。