Использование куки в системе голосования вверх / вниз

Я хочу создать систему голосования "вверх / вниз" для нескольких статей, извлеченных из базы данных, но я хочу добавить cookie для каждой статьи, чтобы ограничить число голосов, чтобы срок действия cookie истек через один день, но я не знаю, где добавить соответствующий код,

больше деталей:

<script>
    function vote(id, value) { // function vote with 2 arguments: article ID and value (+1 or -1) depending if you clicked on the arrow up or down
        var dataFields = { 'id': id, 'value': value }; // We pass the 2 arguments
        $.ajax({ // Ajax
            type: "POST",
            dataType: "text",//This for indicate that you'r expecting a text response from server
            url: "WebService.asmx/updateVotes",
            data: dataFields,
            timeout: 3000,

            success: function (dataBack) {
                if(
                    $('#number' + id).html(dataBack);// div "number" with the new number
                    $('#arrow_up' + id).html('<div class="arrow_up_voted"></div>'); // We replace the clickable "arrow up" by the not clickable one
                    $('#arrow_down' + id).html('<div class="arrow_down_voted"></div>'); // We replace the clickable "arrow down" by the not clickable one
                    $('#message' + id).html('<div id="alertFadeOut' + id + '" style="color: green">Thank you for voting</div>'); // Diplay message with a fadeout
                    $('#alertFadeOut' + id).fadeOut(1100, function () {
                        $('#alertFadeOut' + id).text('');
                    });
                },


            error: function () {
                $('#number' + id).text('Problem!');
            }
        });
    }


</script>

приведенный выше код представляет собой скрипт, вызывающий метод ajax для увеличения числа голосов на одного каждый раз, когда пользователь нажимает стрелку вверх, и наоборот, уменьшается.

    public string updateVotes(string id,int value)
{

    System.Threading.Thread.Sleep(500); // delay for 2.5 seconds Network latency

   post p = db.posts.Find(int.Parse(id));
    // assign new values
   p.totalVotes += value;
    db.Entry(p).State = System.Data.EntityState.Modified;
    db.SaveChanges();

    string dataBack =p.totalVotes.ToString();
    return dataBack;
}

Это веб-метод.

Теперь я пытался мыслить громко и кодирую следующую функцию для ewxamine, если cookie равен нулю или нет.

 public bool enableVoting()
{

    HttpCookie cookie = Request.Cookies["enableVote"];

    if (Request.Cookies["enableVote"] != null)
    {
       return true;

    }

    else
    {

      return false;
    }


}

я знаю, что это неправильно, но, по крайней мере, я пытался.

Также где добавить для каждого цикла, чтобы добавить куки, когда пользователь голосует за статью.?

   foreach(post p in db.posts){
        HttpCookie cookie = new HttpCookie("enableVote"+p.ID);
        cookie.Value = "article:"+p.ID;
        cookie.Expires = DateTime.Now.AddDays(1);
        Response.Cookies.Add(cookie);
    }

1 ответ

Решение

Предложение. Не используйте куки для этого. Они легко манипулируются. Очистите историю браузера, и вы сможете голосовать снова.. и снова.. и снова.

Вместо этого создайте таблицу голосования в своей базе данных и добавьте запись с IP-адресом избирателя и идентификатором поста, за который они проголосовали, вместе с отметкой времени.

Таким образом, вы можете легко подсчитать голоса, и когда кто-то голосует, вы быстро проверяете, как давно этот IP последний раз голосовал за эту статью (или любую статью).

Кроме того, с помощью таблицы голосования в вашей базе данных вы можете легко поймать ботов, которые поднимают или опускают все, и ограничивают количество голосов, которые один ip может сделать за любую статью (возможно, не более 1 или двух голосов каждые несколько минут).

Если вы беспокоитесь о том, что несколько человек за одним и тем же IP-адресом не могут голосовать, вы можете включить имя браузера и в качестве голоса учитывать только уникальные ip и версию браузера. Это довольно уникально. Это также можно манипулировать, но это немного сложнее для обычного пользователя.

Обновление: я использую этот код с целью получить несколько уникальный ключ в одном из моих проектов MVC. Пользователь может переключать браузеры и голосовать снова, но это требует немного усилий и больше боли, чем просто очистка истории браузера.

Я объединяю IP, браузер и страну в строку и использую ее в качестве ключа голосования.

public class UserInfo
{
    public String ip { get; private set; }
    public String browser { get; private set; }
    public String country { get; private set; }

    public UserInfo(HttpRequestBase Request)
    {
        ip = Request.UserHostAddress;
        browser = Request.Browser.Platform + " " + Request.Browser.Type + "/" + Request.Browser.Id + " " + Request.Browser.Version;
        country = "";

        if (Request.UserLanguages.Length > 0)
            country += " - " + Request.UserLanguages.ElementAt(0);
    }
}

Я использую эту систему здесь: http://filepublicator.com/ чтобы проверить, есть ли у пользователя ранее загруженные файлы (попробуйте загрузить что-то и закрыть браузер и перейти туда снова, он будет в списке).

Другие вопросы по тегам