2013-10-28 53 views
0

我正在處理我的MVC項目中的投票機制應用程序,我要求用戶只能在瀏覽器中投票一次,如果他第二次到達投票頁面同一個瀏覽器,他不應該能夠投票,但如果他在另一個瀏覽器登錄,他應該能夠再次投票。

爲此,我使用了Cookie來處理這種情況。我所做的是我已經將用戶ID添加到Cookie,並在查看頁面我檢查是否可見投票按鈕。

我的看法是
Cookies獲取更新而不是添加

@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和票PERSONA登錄,他PERSONID存儲在cookie中,所以,如果他試圖達到投票頁面上的投票按鈕將不可見,但隨後他會嘗試在Google Chrome上打開,然後投票。這些投票也按預期工作。現在,當Firefox中的PersonB登錄並投票給他的personid更新的cookie中,所以他也不能在第二次在同一瀏覽器中投票。

但我確切的問題是,當PersonA再次登錄到Firefox時,他可以投票,因爲cookie已經更新了PersonB的ID。那麼無論如何,如果他們已經在瀏覽器中投票,我怎麼能限制PersonA和PersonB。

回答

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代碼軸承)。

+0

我試過如下,仍然沒有得到 var LoginPID = Session [「LoginPersonID」]。ToString(); HttpCookie MyCookie = new HttpCookie(「MyCookie-」+ LoginPID, 「Voted」); MyCookie.Expires = DateTime.Now.AddDays(30); Response.Cookies.Add(MyCookie); ViewData [「CookieData」] = MyCookieCollection; 這是你的意思嗎? –

0

想法

將這兩個ID存儲在一個cookie中。當cookie是一個ID列表(例如逗號分隔)時,它可以對多個人擁有投票限制。您必須檢查試圖投票的人是否不在列表中。

當然這隻適用於假設沒有ID包含選定的分隔符,在這種情況下逗號。如果逗號不是這種情況,請選擇管道或任何符合此屬性的字符。

Algoritm

曲奇機構被設計成存儲鍵值對。鍵和值都是字符串。如果要在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方法。

1

我看到的一個問題是,您從未從請求中讀取cookie。您的控制器始終創建cookie並將其與回覆一起發回。相反,您應該先檢查一下是否存在cookie,然後採取相應措施。

另一方面是,如果您希望每個帳戶的Cookie需要爲每個帳戶創建不同的Cookie(即,基於用戶名或用戶名構建Cookie名稱),或將所有ids /用戶名存儲在該cookie,然後檢查每個對每一個。

+0

如何爲每個帳戶創建不同的Cookie? –

相關問題