ASP.NETでは、Session.Abandon()ではなくSession.Clear()をいつ使用すればよいですか?


118

Session.Clear()とSession.Abandon()はどちらもセッション変数を削除します。私が理解しているように、Abandon()は現在のセッションを終了し、新しいセッションを作成して、EndイベントとStartイベントを発生させます。

ユーザーのログアウトなど、ほとんどの場合、Abandon()を呼び出すことをお勧めします。代わりにClear()を使用するシナリオはありますか?パフォーマンスに大きな違いはありますか?

回答:


172

Session.Abandon() セッション破棄しSession_OnEndイベントがトリガーされます。

Session.Clear()オブジェクトからすべての値(コンテンツ)を削除するだけです。同じキーのセッションはまだ生きています。

したがって、を使用するとSession.Abandon()、その特定のセッションが失われ、ユーザーは新しいセッションキーを取得します。たとえば、ユーザーがログアウトするときに使用できます。

使用Session.Clear()、ユーザーが同じセッション中に残っていることをしたい場合(あなたがたとえば再ログインにユーザーをしたくない場合)、すべてのセッション固有のデータをリセットします。


1
"Darin Dimitrov"がここで提案しているため、Clear()ではなくRemoveAll()を使用する方が良いと思います。stackoverflow.com
a / 3931344/713246

4
@Bibhu:RemoveAll()がClear()より優れていると彼はどのように示唆しましたか?彼の答えで私が見たのは、RemoveAll()がClear()を呼び出すことだけで、機能的には同じように見えます。
Adam Miller 14

1
Session.Abandon()Windows認証を使用する内部アプリの「ログアウト」としてのみ使用-ユーザーは再認証する必要がなく(Chrome、FF)、セッションが
破棄

13

ユーザーがログアウトするときにのみSession.Clear()を使用すると、セキュリティホールが発生する可能性があります。セッションはWebサーバーに関する限り有効です。次に、セッションIDを傍受して取得し、そのセッションをハイジャックすることは、かなり簡単なことです。

このため、ユーザーをログアウトするときは、Session.Abandon()を使用してセッションを破棄し、新しいセッションを作成する方が安全で賢明です(ログアウトUIページが新しいセッションの一部であっても、新しいセッションにはユーザーの詳細が含まれておらず、新しいセッションをハイジャックすることは新しいセッションを持つことと同じであるため、ミュートになります)。


4
空のセッションをハイジャックするポイントは何ですか?ハイジャッカーはまだログインする必要があり、新しいユーザーに誤って提供するデータはありません。
12

3

Session.Abandon上記のようにセッションを破棄するため、誰かをログアウトさせるときにこれを使用する必要があります。Session.Cleareコマースのウェブサイトで買い物かごに使うのが良いと思います。これにより、ユーザーをログアウトせずにバスケットがクリアされます。


しかしSession.Abandon、特定の買い物かごを空にするために使用した場合はどうなりますか?
WTFZane 2017

0

私はこの問題を抱えて両方を試しましたが、「pageEditState」のようながらくたを削除することで解決しなければなりませんでした。

public static void RemoveEverythingButUserInfo()
{
    foreach (String o in HttpContext.Current.Session.Keys)
    {
        if (o != "UserInfoIDontWantToAskForAgain")
            keys.Add(o);
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.