2010-03-14 3 views
4

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

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

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

+0

@jdk вы можете проверить имя пользователя в application_beginrequest и если для этого пользователя существует сеанс перенаправления пользователя на страницу справки. –

+0

@ Сергий М. Я не понимаю. Как это помогает мне различать разные вкладки браузера на стороне клиента, когда они делят сеанс? –

ответ

3

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

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

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

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

0

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

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

class MultipleOpenedPage{ 
    string guid; 
    string pageURL; 
    DateTime timeStamp; 
    bool IsMultiplePageOpened(List<MultipleOpenedPage> list) 
    { 
    ///logic 
    } 
} 
+0

Как вы определяете, что запрос представляет собой новый экземпляр, а не только пользователь, нажимающий F5? – CodingInsomnia

+0

В случае запроса GET, нажатие на F5 похоже на открытие нового экземпляра, как в обоих случаях, новый запрос HTTP GET, поэтому нет простого способа обнаружить. мы можем обнаружить через ajax-запрос при выгрузке страницы, но те запросы ajax иногда терпят неудачу. В случае обновления POST его можно обнаружить, поместив GUID в viewstate и в GUID GUID с учетом обратной связи с указанием значения сеанса. – Adeel

0

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

+0

Если я правильно понимаю ОП, у него нет единого процесса, который занимает много времени на сервере, а серии страниц, которые собирают много информации (в сеансе), которые не следует переинициализировать/переписанные страницами на второй вкладке браузера. –

+0

Даже если это так, я до сих пор не верю, что существует способ различать разные окна браузера. То, что мы обсуждаем, - это поиск способа сохранения состояния прогресса пользователя посредством многостраничного процесса. Это одно из идеальных применений для сеанса. Таким образом, вместо того, чтобы пытаться определить, как пользователь добрался до состояния, которое они сделали, он должен просто создать систему, чтобы реагировать на состояние, в котором он думает, что пользователь. – Thomas

+0

Если кто-то идет вниз, просьба указать их аргументацию. – Thomas

1

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

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

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

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

2

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

0

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

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

Просто подумайте, что все по-другому.