Просмотр сеансов и вкладок ASP.Net MVC - PullRequest
0 голосов
/ 15 декабря 2010

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

Кто-нибудь знает метод, который позволяет создавать закладки без кражи сеанса (без файлов cookie) (и это не работает в MVC2 для аннотаций данных).

Поддержка вкладок таким образом, чтобы они подходили для каждого варианта использования (например, Windows Workflow), проходя одновременно два рабочих процесса.

Я думаю, что URL в строке запроса может это поддержать, но мне интересно, делал ли кто-нибудь еще подобную реализацию.

[Edit] Use case: скажем, я пишу приложение, которое использует что-то вроде Windows Workflow. Каждый рабочий процесс пользовательского интерфейса может выполнять такие действия, как сбор настроек страницы и выполнение какого-либо внешнего процесса. Я могу захотеть сделать два из этих рабочих процессов одновременно (не обязательно один и тот же рабочий процесс пользовательского интерфейса). Таким образом, если я сохраню в сеансе, я получу:

а) Различные вкладки, влияющие на рабочий процесс б) Кнопки «Предыдущая / Следующая» было бы чрезвычайно трудно проработать из-за а).

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

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

С уважением, J

Ответы [ 2 ]

2 голосов
/ 15 декабря 2010

Звучит так, как будто вы пытаетесь сделать следующее:

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

Таким образом, на вкладке A вы ввели «Имя» в качестве имени и отправилии теперь вы находитесь на второй странице на вкладке А. Вы решаете, что собираетесь сделать вопрос также для своего друга, поэтому вы открываете новую вкладку В. На вкладке В вы вводите Тома и отправляете страницу.

В настоящее время в браузере имеется вкладка A, которая находится на странице 2 вопросника с firstname = "Mark", и вкладка B, которая находится на странице 2 вопросника с first name = "Tom".Предполагая, что вы хотите сохранить оба этих параметра в сеансе на сервере, я полагаю, что этот подход вам подойдет.

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

  1. Просмотр сеанса с использованием случайного числа в качестве ключа "var questionaire = session [Request.Form [" questionaire_rnumber "]]
  2. если вопросник не находится в сеансе, вы создаете новый вопросник, обновляете его свойства и вставляете его в сеанс

    var questionaire = new Questionaire ();questionaire.FirstName = Request.Form ["firstName"]сеанс [Request.Form ["questionaire_rnumber"]] = вопросник;

, если вопросник находился в сеансе, вы просто обновляете объект и отображаете следующую страницу, однако при отображенииНа следующей странице вы снова захотите указать скрытое поле случайных чисел в html, используя то же случайное число, которое вы использовали на странице 1.

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

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

Одним из примеров безопасности и производительности может быть то, что злоумышленникпонимает, что ваше приложение работает так, и злоумышленник запрашивает страницу 1 вашей формы 10 000 раз и отправляет страницу 1 каждый раз.За один сеанс пользователя у вас будет 10 000 вопросников.Если злоумышленник удалял свой файл cookie с идентификатором сеанса 10000 раз и для каждого файла cookie с идентификатором сеанса он создавал 10 000 запросов на страницу 1 и отправлял форму страницы 1, у вас было бы 100 000 объектов вопросника в совокупности на 10000 сеансов на вашем сервере.Таким образом, вы должны наложить на него некоторые ограничения, чтобы защитить ваше приложение, например:

  1. В любом отдельном сеансе может быть только X вопросников в сеансе
  2. Любой отдельный IP-адрес может иметь только Yодновременные сеансы (это вам, вероятно, понадобится отслеживать в объекте приложения)

ДОПОЛНИТЕЛЬНЫЙ ОТВЕТ НА ДОБАВЛЕННЫЙ СЛУЧАЙ ИСПОЛЬЗОВАНИЯ

Спасибо за вариант использования.Мое решение все еще должно работать для вас.У вас есть два варианта.

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

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

0 голосов
/ 15 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...