2010-05-15 4 views
25

Я хотел бы сохранить состояние сеанса на вкладке браузера.asp.net - сеанс - несколько вкладок браузера - разные сеансы?

Это легко (или даже возможно) сделать в ASP.NET?

Пример: Пользователь нажимает Ctrl-T в firefox 5 раз и посещает сайт на каждой вкладке. Я хотел бы каждую вкладку, чтобы иметь свое собственное состояние сеанса на сервере

ответ

20

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

В функции загрузки формы, включают в себя:

If Not IsPostback Then 
    'Generate a new PageiD' 
    ViewState("_PageID") = (New Random()).Next().ToString() 
End If 

Когда вы что-то сохранить для вашего состояния сеанса, включают PageId:

Session(ViewState("_PageID").ToString() & "CheckBoxes") = D 

Notes:

  • As с идентификаторами сеанса в целом, вы не можете верить, что злонамеренные зрители не изменятся SessionID/PageID. Это только допустимое решение для среды, где всем пользователям можно доверять. К счастью, ViewState предлагает больше защиты, чем использование скрытого поля ввода.
  • У вас не будет доступа к PageID, пока ViewState не будет восстановлен после PostBack. Поэтому у вас не будет доступа к идентификатору страницы в обработчике page_init().
+1

Для разработчиков, использующих веб-формы ASP.NET, вы можете получить степень защиты от вредоносных пользователей, искажающих идентификатор страницы, используя ViewState, а не скрытое скрытое поле HTML. По умолчанию ViewState хешируется ключом машинного сервера, а ASP.NET генерирует исключение, если опубликованные данные не являются допустимым хэшем. Если идентификатор сеанса изменен, это, как правило, приведет к созданию нового сеанса, когда на него будут записаны следующие данные, поскольку существующий сеанс будет недействительным - попытки отозвать существующие данные приведут к пустым ссылочным исключениям. Мог бы проверить это свойство IsNewSession. – pwdst

+0

@pwdst Отличная точка, я настрою решение для соответствия! Спасибо –

+2

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

14
<configuration> 
    <system.web> 
    <sessionState cookieless="true" 
     regenerateExpiredSessionId="true" /> 
    </system.web> 
</configuration> 

http://msdn.microsoft.com/en-us/library/ms178581.aspx

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

+0

Cookieless = «истина» действительно необходимо? – ErTR

+0

@ Ertürk Öztürk: звучит вопрос: «Я бы хотел сохранить состояние сеанса на вкладке браузера». Все экземпляры браузера имеют одни и те же файлы cookie. – zerkms

+0

@zerkms Я в порядке с cookieless, но мне нужно установить его динамически при загрузке страницы. К сожалению, он доступен только для чтения. – ErTR

0

Использование ответа Brian Webster Я нашел проблему с XMLHttpRequests. Оказалось, что XMLHttpRequests не установил флаг IsPostback в true, и поэтому запрос выглядел как новый запрос, и в итоге у него было бы новое состояние сеанса для этого запроса. Чтобы решить эту проблему, я также проверил значение ViewState("_PageID")

так, что мой код выглядит следующим образом в C#:

protected dynamic sessionVar; //a copy of the session variable 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack && ViewState["_PageID"] == null) 
    { 
     ViewState["_PageID"] = (new Random()).Next().ToString(); 
     Session[ViewState["_PageID"] + "sessionVar"] = initSessionVar(); //this function should initialize the session variable 
    } 
    sessionVar = Session[ViewState["_PageID"] + "sessionVar"]; 
    //... 
} 
Смежные вопросы