web-dev-qa-db-ja.com

Session.Abandon()とSession.Clear()の違いは何ですか

セッションを破棄することとその値を削除することの違いは何ですか?これを示す例を提供してもらえますか?

この質問を検索しましたが、全体の答えを把握していません。いくつかの答えは次のとおりです。

  • Session.Abandon()はセッションを破棄します
  • Session.Clear()はすべての値を削除するだけです

友人が私に言った:

セッションをクリアしてもセッションは解除されません。ユーザーに対して同じIDで存在しますが、値は単にクリアされたままです。

Abandonはセッションを完全に破棄します。つまり、そのユーザーのセッションにさらに値を保存するには、新しいセッションを開始する必要があります。

以下のコードは機能し、例外をスローしません。

_Session.Abandon();
Session["tempKey1"] = "tempValue1";
_

セッションをAbandon()すると、あなた(またはユーザー)が新しいSessionIdを取得します

セッションをテストするとき、セッションを放棄しても変更はありません。

私はただ一つの違いを見つけました:session.Abandon()は_Session_End_イベントを発生させます

102
backdoor

Clear -セッション状態コレクションからすべてのキーと値を削除します。

放棄 -セッションに保存されているすべてのオブジェクトを削除します。 Abandonメソッドを明示的に呼び出さない場合、サーバーはこれらのオブジェクトを削除し、セッションがタイムアウトしたときにセッションを破棄します。
Session_End のようなイベントも発生します。

Session.Clearは棚からすべての本を削除すると比較できますが、Session.Abandonは棚全体を捨てるに似ています。

あなたは言う:

セッションをテストするとき、セッションを放棄しても変更はありません。

これは、1つのリクエスト内でのみ実行している間に正しいです。
次のリクエストでは、セッションが異なります。ただし、 セッションIDは再利用可能 なので、IDは同じままです。

Session.Clearを使用する場合、多くのリクエストで同じセッションを使用できます。

通常、ほとんどの場合、Session.Clearを使用する必要があります。
ユーザーがサイトを離れることが確実な場合は、Session.Abandonを使用できます。

違いに戻りましょう:

  1. 放棄はSession_End要求を発生させます。
  2. Clearはアイテムを即座に削除しますが、Abandonは削除しません。
  3. AbandonはSessionStateオブジェクトとそのアイテムを解放し、ガベージコレクションを行ってリソースを解放できるようにします。 Clearは、SessionStateとそれに関連付けられたリソースを保持します。
140

SessionをAbandon()すると、あなた(またはユーザー)は(次のリクエストで)新しいSessionIdを取得します。 SessionをClear()すると、保存されている値はすべて削除されますが、SessionIdはそのまま残ります。

19
Hans Kesting

これはsortの上記のさまざまな応答でカバーされていますが、この記事を初めて読んだときに重要な事実を見逃し、コードのマイナーバグにつながりました...

Session.Clear()は、すべてのキーの値を消去しますが、セッション終了イベントを発生させません。

Session.Abandon()は、現在のリクエストの値をクリアしません。別のページが要求されると、そのページの値はなくなります。ただし、放棄するとイベントがスローされます。

それで、私の場合(そしておそらくあなたのものですか?)、Clear()に続いてAbandon()が必要でした。

8
NRC

このコードは機能し、例外をスローしません:

Session.Abandon();  
Session["tempKey1"] = "tempValue1";

これは、Abandonメソッドが呼び出されると、現在のSessionオブジェクトが削除キューに入れられますが、現在のページのすべてのスクリプトコマンドが処理されるまで実際には削除されないためです。つまり、Abandonメソッドの呼び出しと同じページのSessionオブジェクトに格納されている変数にアクセスできますが、後続のWebページにはアクセスできません。

たとえば、次のスクリプトでは、3行目は値Maryを出力します。これは、サーバーがスクリプトの処理を完了するまでSessionオブジェクトが破棄されないためです。

<% 
  Session.Abandon  
  Session("MyName") = "Mary" 
  Reponse.Write(Session("MyName")) 
%>

後続のWebページで変数MyNameにアクセスすると、空になります。これは、前の例を含むページの処理が終了したときに、MyNameが前のSessionオブジェクトで破棄されたためです。

from MSDN Session.Abandon

5
Seven

clear-itsは、セッション状態コレクションからキーまたは値を削除します。

セッションからセッションオブジェクトを削除または削除します。

3
maxy

セッションをクリアすると、そこに保存されていた値は削除されますが、新しい値をそこに追加できます。セッションを破棄した後、そこに新しい値を追加することはできません。

3
RaYell
Session.Abandon() 

セッション全体を破棄/強制終了します。

Session.Clear()

セッションデータ(つまり、現在のセッションのキーと値)を削除/クリアしますが、セッションは生きています。

Session.Abandon()メソッドと比較すると、Session.Clear()は新しいセッションを作成せず、セッション内のすべての変数をNULLにします。

ブラウザが閉じられていない限り、セッションIDは両方のケースで同じままです。

Session.RemoveAll()

セッション状態コレクションからすべてのキーと値を削除します。

Session.Remove()

セッション状態コレクションからアイテムを削除します。

Session.RemoveAt()

指定されたインデックスにあるアイテムをセッション状態コレクションから削除します。

Session.TimeOut()

このプロパティは、アプリケーションのSessionオブジェクトに割り当てられるタイムアウト期間を指定します。 (時間は分単位で指定されます)。

ユーザーがタイムアウト期間内にページを更新またはリクエストしない場合、セッションは終了します。

1
Laxmi

Sessionidの存在は、PCIコンプライアンスのポイントの1つであるセッション固定攻撃を引き起こす可能性があります。セッションIDを削除してセッション固定攻撃を克服するには、このソリューションをお読みください- ASP.NETのセッション固定の脆弱性を回避する方法?

0
Sheo Narayan
this code works and dont throw any exception:

Session.Abandon();  
Session["tempKey1"] = "tempValue1";

ここで注意すべき点は、Session.Clearはすぐにアイテムを削除しますが、Session.Abandonは現在のリクエストの終了時にセッションが破棄されるようにマークすることです。それは単に、session.abandonコマンドが実行された直後にコード内の値にアクセスしようとした場合、それはまだそこにあることを意味します。したがって、session.abandonコマンドを発行し、すぐにセッションで何らかのロジックを実行した後でもコードが機能しない場合でも混乱しないでください。

0
Biki

Session.Clear()を使用するよりもSession.Abandon()を使用すると便利だと思います。

後で呼び出した後もセッションに値が存在しますが、前者を呼び出した後に値が削除されるためです。

0
Pra