web-dev-qa-db-ja.com

asp.net-セッション-複数のブラウザータブ-異なるセッション?

ブラウザのタブごとにセッション状態を維持したいと思います。

ASP.NETでこれを行うのは簡単ですか?

例:ユーザーがFirefoxでCtrl-Tを5回押し、各タブでサイトにアクセスします。サーバーで各タブに独自のセッション状態を持たせたい

27
Brian Webster

URLを乱雑にすることなく1人のユーザーのマルチタブセッション状態を促進するには、次の手順を実行します。

フォームのロード関数に、次を含めます。

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

セッション状態に何かを保存するときは、PageIDを含めます。

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

  • 一般にセッションIDと同様に、悪意のある視聴者がSessionID/PageIDを変更しないとは信じられません。これは、すべてのユーザーを信頼できる環境でのみ有効なソリューションです。幸いなことに、ViewStateは非表示の入力フィールドを使用するよりも強力な保護を提供します。
  • PostBackでViewStateが復元されるまで、PageIDにアクセスできません。したがって、page_init()ハンドラーでPageIDにアクセスすることはできません。
21
Brian Webster
<configuration>
  <system.web>
    <sessionState cookieless="true"
      regenerateExpiredSessionId="true" />
  </system.web>
</configuration>

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

この場合、各タブは一意のIDを取得し、別の訪問者のように見えます。

15
zerkms

Brian Webster 's answerを使用すると、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"];
    //...
}
1