asp.net - сессия - несколько вкладок браузера - разные сессии? - PullRequest
27 голосов
/ 15 мая 2010

Я бы хотел сохранить состояние сеанса для каждой вкладки браузера.

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

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

Ответы [ 3 ]

21 голосов
/ 16 мая 2010

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

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

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

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

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

Примечания :

  • Как и в случае с идентификаторами сеансов в целом, вы не можете полагать, что злоумышленники не изменят SessionID / PageID. Это только правильное решение для среды, в которой всем пользователям можно доверять. К счастью, ViewState предлагает больше защиты, чем использование скрытого поля ввода.
  • У вас не будет доступа к PageID, пока ViewState не будет восстановлен после PostBack. Следовательно, у вас не будет доступа к PageID в обработчике page_init ().
15 голосов
/ 15 мая 2010
<configuration>
  <system.web>
    <sessionState cookieless="true"
      regenerateExpiredSessionId="true" />
  </system.web>
</configuration>

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

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

1 голос
/ 19 февраля 2018

Использование ответа Брайана Вебстера Я обнаружил проблему с запросами XMLHttp. Оказалось, что 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"];
    //...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...