#asp.net #vb.net #session
Вопрос:
Веб-сайт, установленный на сервере компании, и используйте сеанс для хранения пользовательской информации, такой как учетная запись пользователя и имя. Я записал сеанс на странице входа в систему и никогда не переписывал его, но на клиентском КОМПЬЮТЕРЕ возникла проблема с изменением учетной записи, поскольку пользователь A в процессе работы с его учетной записью изменится на пользователя B, возможно, во время входа пользователя B. Пользователь A и пользователь B находятся в одной интрасети и используют разные ПК.
Является ли сессия причиной этой проблемы? Как решить эту проблему, меняя код меньше?
Комментарии:
1. Настроен ли пул приложений для сайта на использование более одного рабочего процесса («веб-сад»)? В разделе «Дополнительные настройки» это «Максимальное количество рабочих процессов». Это может вызвать эту проблему. Веб-сады… они хорошие или плохие, или что?
Ответ №1:
Ну, у вас есть две довольно отдельные проблемы.
Сначала пользователь может войти в систему с разными логинами. Это на самом деле должно давать им отдельные сеансы. Возможно, вы неправильно выводите пользователя из системы при выходе из системы. (или, может быть, вы свернули свою собственную систему входа в систему — плохая идея!! — с этого момента у вас может и будет проблема сеанса.
Далее: вы должны принять дизайн, в котором session() позволяет ОДНОМУ пользователю работать и работать, если он щелкнет правой кнопкой мыши — новая вкладка или даже запустит другую копию веб-браузера. Так что здесь вы должны быть ОЧЕНЬ осторожны. Допустим, пользователь нажимает на gridview — типичный выбор какого-то проекта, продукта или чего-то еще. Таким образом, вы вводите идентификатор PK этой выбранной строки в сеанс, а затем, конечно же, переходите на новую страницу.
но, если у них открыты две вкладки или в этой сетке открыты два браузера? Что ж, теперь они могут щелкнуть по одной копии, выбрать строку, перейти на новую страницу. Затем пользователь делает то же самое в другой сетке.
Теперь ваш идентификатор сеанса PK ОТЛИЧАЕТСЯ для первой страницы. Если этот код продолжает использовать session() для получения этой информации, у вас БОЛЬШИЕ проблемы!!! — идентификатор PK в сеансе на первой странице теперь другой, а не PK, выбранный пользователем.
Итак, что делать в выше? ну, есть куча обходных путей — некоторые добавляют пользовательский номер к некоторому значению сеанса — некоторые добавляют номер к URL-адресу — все довольно запутанно.
Простое решение? Примите практику кодирования, согласно которой вы используете session() ТОЛЬКО для передачи значений, но при первой загрузке страницы вы передаете это в ViewState. Состояние просмотра для каждой страницы (или для каждой вкладки, или для каждой страницы браузера). Session(), конечно, является глобальным для пользователя.
Итак, если они выбирают дом для покупки из этой сетки, перейдите на новую страницу. Теперь они делают то же самое во 2-й копии браузера — они находятся в двух разных домах, но значение PK вашего сеанса отличается!!! Если они нажмут кнопку «Купить» или какие-либо другие операции на первой странице? Этот код больше НЕ может использовать session(), не так ли?
Итак, даже когда у меня есть, скажем, 4-5 значений, я должен перейти на следующую страницу через сеанс? I при загрузке страницы (is postback = false) перенесите эти значения в ViewState. Теперь вы пишете ВЕСЬ КОД НА этой странице, чтобы ВСЕГДА использовать ViewState, и, таким образом, значения session() никогда не спотыкаются друг о друга. Две веб-страницы в одной сетке, клики пользователя — переход через сеанс, переход в состояние просмотра. Итак, теперь тебе все равно.
И приведенный выше подход позволил бы решить вашу проблему, по крайней мере, с передачей значений. Однако я не вижу особых причин хранить информацию о пользователе в session(). Это то, что делает для вас членство, роли и система входа в систему, и, следовательно, если они входят в систему с другим идентификатором, то членство GetUserID и т. Д. Должно и вернет правильный идентификатор пользователя. Итак, в то время как приведенный выше шаблон проектирования решит проблему отключения PK и передачи сообщений, он не решит вашу информацию о сеансе, которую вы имеете для пользователя. Но, как я уже говорил, на САМОМ деле это не так, и вам все равно не нужно хранить информацию о входе пользователя в сеанс.
однако, если вы правильно делаете, и позволяете пользователю изменять / переключать / переходить к новому другому входу в систему? Если вы сначала выйдете из системы пользователя, то сеанс может и должен начаться заново — неясно, как вы выходите из системы пользователя, но я бы посмотрел на этот код.
Я использую это для выхода из системы пользователя:
Session.Abandon()
FormsAuthentication.SignOut()
Таким образом, вышеизложенное должно начать новый сеанс — даже если вы разрешаете пользователю переключаться, изменять или входить в систему под другим пользователем.
Тем не менее, общий по всем вопросам сеанса? Ваша проблема заключается не только в информации о сеансе пользователя, но и в использовании значений session() в общем коде — будьте осторожны и всегда спрашивайте, можно ли использовать значения в session(), если, скажем, у пользователя было открыто 2 или 5 копий браузера.
Комментарии:
1. Я использую сеанс. Очистка() и проверка подлинности форм. SignOut() для выхода из системы пользователя и записи его на главной странице. Конечно, пользователи входят в систему с помощью одного и того же браузера, разные вкладки изменят пользователя, но пользователи входят в систему с разных ПК.
2. Я бы добавил сеанс. Отказаться от () выше. Очистка сеанса все равно может сохранить его активным, поэтому сделайте оба. Что касается комментариев о session()? Просто указываю на некоторые проблемы, если пользователи щелкают правой кнопкой мыши или открывают несколько вкладок — вы должны быть внимательны.