Взаимодействие клиента и сервера с помощью document.cookie
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Взаимодействие клиента и сервера с помощью... Expand / Collapse
Автор
Сообщение
29.09.2006 13:35
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
В данный момент пишу сайт с возможностью размещения заказа. Все как обычно - есть страницы со списком товаров, посетитель добавляет товары в корзину и затем размещает заказ со страницы корзины. Напротив каждой позиции (товара) есть поле для ввода количества, которое нужно добавить к заказу. И вот тут начинается интересное. На событие onchange поля ввода вызывается код javaScript, который создает новую cookie с именем g#### и со значением равным кол-ву указанным в поле ввода (вместо #### подставляется уникальный id товара). Если посетитель укажет другое кол-во для того же товара, то "новая" cookie заменит "старую". Указание кол-ва для другого товара создаст еще одну cookie. И т.д.

При следующем запросе к любой странице данного сайта бразуер отправит данные cookie вместе со всеми остальными. В этот момент серверный код выполнит реальное обновление содержимого корзины, которое хранится в таблице БД. В этой таблице есть уникальный идентификатор корзины. Он тоже будет храниться в cookie чтобы сервер мог знать в какую корзину добавлять позиции. Если cookie нет, то будет создана новая корзина и посетителю будет отправлена cookie с идентификатором этой корзины.

Обработав cookie c именем g#### сервер отправит клиентскому браузеру ответ, чтобы он удалил данные cookie так, что двойной обработки не произойдет.

Плюс такого подхода в его широкой поддержке и, как мне кажется, относительной простоте. Браузеру нужно только поддерживать cookie и javaScript. Сервер же обрабатывает несколько запросов клиента пакетом.

Серверная часть пишется на ASP.NET и подобный механизм удобно реализуется путем создания своего HTTP модуля с обработчиком события BeginRequest. Но конкретный язык реализации здесь не важен. Мне хотелось бы узнать кто что думает насчет жиэнеспособности такого подхода? И, пожалуйста, не надо рассказывать про AJAX, здесь речь о другом.

Мне удалось выделить следующие возможные проблемы:

  1. Состояние "гонки" между двумя запросами. К примеру, посетитель вводит для товара с id=123 кол-во 5 (создается cookie g123=5). Затем открывает ссылку с этого сайта в новом окне, содержимое которого из-за временных проблем со связью грузится медленно. Он возвращается в первое окно и меняет там кол-во для товара id=123 на 1 (создается cookie g123=1). Теперь он открывает ссылку в этом же окне (содержимое второго окна все еще грузится!) и оно загружается раньше чем содержимое второго окна. В корзину добавляется товар с количеством 1. В этот момент загружается содержимое второго окна, где была отправлена cookie g123=5 и в корзине теперь 5 позиций товара вместо 1.

    Что с этим делать пока непонятно.
  2. Возможность столкнуться с ограничением на максимальный объем/кол-во cookie. MSIE точно имеет подобные ограничения, зависящие от security zone в которую входит сайт. К сожалению не могу найти конкретные цифры. Кроме того надо найти аналогичную информацию, как минимум, для Opera и Firefox.
  3. Потеря cookie из-за очистки кеша браузера. Если клиент добавив товары в корзину тут же закроет браузер и очистит кеш и/или удалит все cookie, то данные не будут сохранены. С другой стороны он потеряет не только cookie c необработанным кол-вом, но и другие cookie. Данная ситуация вероятна, но делать тут врядли что-то нужно.
  4. Отсутствие поддержки cookie/javascript. Этот пункт здесь просто для напоминания. Маловероятно что такое случится так как на сайте есть и другая функциональность зависящая от cookie/javascript так что данный случай мы игнорируем.

Итак, у кого какие мысли?

Сообщ. #905084
29.09.2006 13:50


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 29.10.2007 14:45
Сообщ.: 1 833, Visits: 16 863
1) Усли уж такое и будети, то крайне редко. На это вполне можно закрыть глаза.
2) Опять же - врятли. Это должен быть какой-то супер-покупатель. Килобайта 4 у тебя точно есть.
3) Думаю, об этом даже и не стоит упоминать.
4) Опять же - очень мала вероятность.

А общем и целом я считаю это ъорошим подходом. Думаю, его стОит исопльзовать. Минусы слишком незначительные.

Сообщ. #905087
29.09.2006 14:21
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
Спасибо. Возможность возникновения гонки все-таки считаю весьма вероятной. Пока думаю как это можно победить.
Сообщ. #905089
02.10.2006 10:58
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
Уже столкнулся с ограничением по пункту №2. Не получается создать больше 20 cookie. Это ограничение указано в RFC 2109. HTTP State Management Mechanism (см. раздел 6.3 Implementation Limits). Обойти в приницпе несложно, надо сохранять id товаров в одну cookie в виде строки с разделителями. В том же RFC сказано что user-agent должен поддерживать cookie c длиной минимум 4 Кб, что для моих целей вполне достаточно.

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

Сообщ. #905142
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 9:23