Однозначно определить два экземпляра одного браузера, которые совместно используют состояние сеанса? - PullRequest
4 голосов
/ 14 марта 2010

Я хочу убедиться, что пользователь не редактирует одни и те же данные формы в двух разных вкладках или окнах браузера (одного и того же экземпляра веб-браузера). Намерение состоит в том, чтобы не дать пользователю случайно перезаписать свои собственные данные, поскольку они продолжают проходить через очень длинный процесс формы. На сервере текущий ввод данных через экраны собирается в сеанс.

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

Учитывая, что форма уже создана, и это один из последних штрихов, как я могу использовать ASP.NET, , надеюсь, легко , чтобы контролировать это "Особенность"?

Ответы [ 6 ]

3 голосов
/ 14 марта 2010

Вы можете попробовать что-то вроде этого:

Сохранить целое число как сеанс ["LastRequest"]. Поместите это в скрытое поле на странице. Для каждого запроса вы добавляете один к целому числу.

При обратной передаче убедитесь, что другой запрос не был выполнен, проверив, что Request.Form ["LastRequest"] равен Session ["LastRequest"].

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

2 голосов
/ 16 марта 2010

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

1 голос
/ 16 марта 2010

Вы не можете различить два HTTP POST для одной и той же страницы, даже если они находятся на разных вкладках.

Это похоже на известную проблему с кнопками «назад» - они могут публиковать, нажимать назад и отправлять репосты.

Обычное решение - скрытые поля отслеживания, но очень сложно сделать их надежными.

Если это процесс типа мастера, должно быть просто обнаружить, перезаписывают ли они уже введенные поля, и показать предупреждение.

0 голосов
/ 06 сентября 2011

Я обошел это, создав базовый класс, унаследованный от System.Web.UI.Page и в событии page_load / init, создав объект, содержащий информацию, специфичную для пользовательского экземпляра.

Это значит, что каждая новая созданная страница получает свой собственный экземпляр объекта и поэтому может поддерживать разные состояния / свойства, которые можно использовать для внесения различных изменений в данные на одной странице.

Просто мысль, потому что это немного по-другому.

0 голосов
/ 15 марта 2010

Из-за природы Интернета, не имеющей состояния, я не верю, что существует надежный способ провести различие между двумя окнами браузера. Однако вы можете сохранить флаг в сеансе, что данный длительный процесс выполняется. Таким образом, вам все равно, будут ли они пытаться перезапустить процесс из одного окна браузера или из нескольких окон браузера. Хитрость заключается в том, чтобы обрабатывать ситуации, когда процесс завершается неудачно и не получает возможности сбросить флаг, чтобы процесс мог быть запущен снова.

0 голосов
/ 14 марта 2010

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

Следующая структура данных поможет.

class MultipleOpenedPage{
    string guid;
    string pageURL;
    DateTime timeStamp;
    bool IsMultiplePageOpened(List<MultipleOpenedPage> list)
    {
    ///logic 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...