Session.Abandon ()과 Session.Clear ()의 차이점은 무엇입니까?


109

세션을 파괴하는 것과 그 값을 제거하는 것의 차이점은 무엇입니까? 이를 보여주는 예를 제공해 주시겠습니까?

이 질문을 검색했지만 전체 답변을 파악하지 못했습니다. 몇 가지 대답은 다음과 같습니다.

  • Session.Abandon() 세션을 파괴
  • Session.Clear() 모든 값을 제거합니다.

친구가 이렇게 말했습니다.

세션을 지워도 세션이 설정 해제되지는 않지만 사용자 ID는 동일하지만 값은 지워진 상태로 계속 존재합니다.

Abandon은 세션을 완전히 파괴합니다. 즉, 해당 사용자의 세션에 더 많은 값을 저장하기 전에 새 세션을 시작해야합니다.

아래 코드는 작동하며 예외를 발생시키지 않습니다.

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

세션을 Abandon ()하면 사용자 (또는 사용자)가 새 SessionId를 받게됩니다.

세션을 테스트 할 때 세션을 중단해도 아무런 변화가 없습니다.

난 그냥 한 차이를 찾을 : session.Abandon()제기 Session_End이벤트를


5
Session.Clear는 즉시 항목을 제거하지만 Session.Abandon은 현재 요청이 끝날 때 세션이 중단되도록 표시합니다.
RepDbg 2014

답변:


147

지우기 -세션 상태 컬렉션에서 모든 키와 값을 제거합니다.

포기 -세션에 저장된 모든 개체를 제거합니다. Abandon 메서드를 명시 적으로 호출하지 않으면 서버는 이러한 개체를 제거하고 세션 시간이 초과되면 세션을 삭제합니다.
또한 Session_End 와 같은 이벤트를 발생 시킵니다.

Session.Clear는 선반에서 모든 책제거하는 것과 비교할 수 있지만 Session.Abandon은 전체 선반을 버리는 것과 비슷 합니다.

당신은 말한다 :

세션을 테스트 할 때 세션을 중단해도 아무런 변화가 없습니다.

이것은 하나의 요청 내에서만 수행하는 동안 정확 합니다 .
다음 요청에서 세션이 달라집니다. 그러나 세션 ID를 재사용 하여 ID가 ​​동일하게 유지 될 수 있습니다 .

Session.Clear를 사용하면 많은 요청에서 동일한 세션을 갖게됩니다.

일반적으로 대부분의 경우 Session.Clear를 사용해야합니다.
사용자가 사이트를 떠날 것이 확실하다면 Session.Abandon을 사용할 수 있습니다.

따라서 차이점으로 돌아가십시오.

  1. Abandon은 Session_End 요청을 발생시킵니다.
  2. Clear는 항목을 즉시 제거하고 Abandon은 그렇지 않습니다.
  3. Abandon은 리소스를 해제하기 위해 가비지 수집을 수행 할 수 있도록 SessionState 개체와 해당 항목을 해제합니다. Clear는 SessionState 및 관련 리소스를 유지합니다.

session.clear () 호출하면 다시 accures를 알립니다. 아니? (모든 사람이 모금 Session_End 이벤트)
백도어

Session.Clear는 세션에서 항목 제거합니다. 더 이상은 없습니다. 필요한만큼 여러 번 호출 할 수 있습니다.
Dmytrii Nagirniak

@AnthonyWJones, 당신은 맞습니다 "파괴"라고 말하는 것은 잘못되었습니다. 세션에서 개체를 REMOVE하는 것이 좋습니다. 그러나 Session.Clear는 객체를 파괴하지 않고 세션에서 thm을 제거하여 가비지 수집 될 수 있도록합니다. 또한 COMPLEX 객체를 저장하는 것은 권장되지 않습니다. 그렇지 않으면 괜찮다고 생각합니다.
Dmytrii Nagirniak 09.09.24

@Dmitriy : 왜 "COMPLEX 객체를 저장하지 않는 것이 좋습니까?"
Kamarey

5
@Ads 동의 합니다만, 그것이 바로Session.Clear 서가에서 모든 책을 제거하는 것과 비교할 수 있다고 말함으로써 확장 할 것이지만 , "서가 전체를 버리고 완료되면 알려주십시오 "라고 말하는 것과 비슷 합니다. Session.Abandon
WynandB 2014

20

당신 Abandon()이 세션 일 때 , 당신 (또는 오히려 사용자)은 (다음 요청에서) 새로운 SessionId를 얻게 될 것입니다. 때 Clear()세션은, 모든 저장된 값이 제거되지만 세션 ID는 그대로 유지됩니다.


3
감사. 그러나 mattew macdonalds 책에 따라 동일한 세션 ID를 사용할 수 있습니다. i는 web.config 파일의 configuration / system.web / sessionState 요소에서 regenerateExpiredSessionId 속성이 false이면 ASP.Net이 이전 세션 ID를 사용함을 의미합니다
백도어

2
@Hans Kesting 포기가 호출되면 새 세션 ID를 얻지 못합니다. 새 세션 ID를 얻으려면 ASPNET_SessionID 쿠키를 null로 명시 적으로 설정해야합니다.
Zo Has

9

이다 일종의 위의 다양한 반응에 의해 덮여의,하지만 난이 기사를 읽고 처음으로 나는 내 코드에서 사소한 버그로 이끄는 중요한 사실을 놓친 ...

Session.Clear() 모든 키의 값을 지우지 만 세션 종료 이벤트가 발생하지 않습니다.

Session.Abandon()현재 요청의 값을 지우지 않습니다. 다른 페이지가 요청되면 해당 페이지에 대한 값이 사라집니다. 그러나 포기하면 이벤트가 발생합니다.

그래서, 내 경우에는 (그리고 아마도 당신에?), I가 필요합니다 Clear()다음 Abandon().


1
Session.Clear () 다음에 Session.Abandon ()이 필요한 이유는 무엇입니까? 파괴하는 컬렉션의 가치를 지우고 있습니까? 이것은 완전히 중복됩니다. 세션 객체가 즉시 삭제되지는 않지만 (현재 요청이 끝날 때 발생) 해당 세션 ID는 더 이상 후속 요청에서 제공되지 않습니다. 클라이언트가 새 요청을하면 새 세션이 제공됩니다. Clear를 먼저 호출하면 Global.Asax의 Session_End () 이벤트에있는 세션 변수에 액세스하려는 경우에도 문제가 발생합니다 (삭제했기 때문에 존재하지 않습니다).
RepDbg 2014

@RepDbg 실제로 나는 동의하지 않습니다. Session.Abandon (). 클라이언트에게 새 세션 ID를 제공합니다. 다른 사용자가 NRC에 동의 두렵나 있도록 Session.clear는 세션에 대한 서버의 모든 정보를 삭제합니다
미가 Armantrout

@ Micah Armantrout 나는 당신의 논리를 따르지 않습니다. Session.Clear ()로 세션을 정리 한 다음 Session.Abandon ()을 호출하여 세션을 정리할뿐만 아니라 완전히 할당 해제하는 이유는 무엇입니까? 또한 Session.Abandon ()은 클라이언트에게 새 세션 ID를 제공하지 않습니다. 후속 요청은 Session.Abandon ()을 호출 한 요청의 이행이 아닙니다.
RepDbg

Session.Abandon 만 사용하는 경우 ASP.NET 파이프 라인의 다른 나머지 논리는 여전히 현재 세션 값에 액세스 할 수 있습니다.
Mark Sowul

6

이 코드는 작동하며 예외를 발생시키지 않습니다.

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

Abandon 메서드가 호출되면 현재 Session 개체가 삭제 대기열에 있지만 현재 페이지의 모든 스크립트 명령이 처리 될 때까지 실제로 삭제되지 않기 때문입니다. 즉, Abandon 메서드에 대한 호출과 동일한 페이지에서 세션 개체에 저장된 변수에 액세스 할 수 있지만 이후 웹 페이지에는 액세스 할 수 없습니다.

예를 들어, 다음 스크립트에서 세 번째 행은 Mary 값을 인쇄합니다. 이는 서버가 스크립트 처리를 완료 할 때까지 Session 개체가 파괴되지 않기 때문입니다.

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

후속 웹 페이지에서 MyName 변수에 액세스하면 비어 있습니다. 이는 이전 예제가 포함 된 페이지가 처리를 완료했을 때 이전 Session 개체로 MyName이 삭제 되었기 때문입니다.

에서 MSDN Session.Abandon


3

세션을 지우면 거기에 저장된 값이 제거되지만 여전히 새 값을 추가 할 수 있습니다. 세션을 삭제 한 후에는 새 값을 추가 할 수 없습니다.


감사하지만 이것은 작동합니다 :( 당신의 아이디어와 일치하지 않음) Session.Abandon (); Session [ "tempKey1"] = "tempValue1"; Response.Write (Session [ "tempKey1"]. ToString ());
백도어

실제로 페이지를 새로 고친 후에 세션이 파괴되기 때문입니다. 일반적으로 쿠키에 저장된 세션 ID입니다.
RaYell

이해가 안 돼요. Session.Abandon ()을 호출 한 후에도 여전히 값을 추가 할 수 있습니다. (페이지가 다시 게시되고 다시 렌더링되는 경우에도).
백도어

1
ID가 파괴 된 후 자동 재생성하도록 세션을 설정할 수 있습니다. 따라서 파괴 된 세션에 값을 할당하면 새 세션이 자동으로 생성됩니다.
RaYell

1
예,이 세션 ID를 사용하면 재생성되지만 내 질문은 session.clear ()와 session.abandone ()의 차이점입니다. 이런 식으로 autoregenerate가 false로 설정되면 이러한 견인은 Sesion_End를 올리는 다른 것과 다르지 않습니까?
백도어

3

clear-its 세션 상태 수집에서 키 또는 값을 제거합니다.

포기-세션에서 세션 개체를 제거하거나 삭제했습니다.


1
Session.Abandon() 

전체 세션을 파괴 / 종료합니다.

Session.Clear()

세션 데이터 (즉, 현재 세션의 키와 값)를 제거 / 지우지 만 세션은 살아 있습니다.

Session.Abandon () 메서드와 비교하면 Session.Clear ()는 새 세션을 생성하지 않고 세션의 모든 변수를 NULL로 만듭니다.

세션 ID는 브라우저가 닫히지 않는 한 두 경우 모두 동일하게 유지됩니다.

Session.RemoveAll()

세션 상태 컬렉션에서 모든 키와 값을 제거합니다.

Session.Remove()

세션 상태 컬렉션에서 항목을 삭제합니다.

Session.RemoveAt()

세션 상태 컬렉션에서 지정된 인덱스의 항목을 삭제합니다.

Session.TimeOut()

이 속성은 응용 프로그램의 세션 개체에 할당 된 제한 시간을 지정합니다. (시간은 분 단위로 지정됩니다).

사용자가 제한 시간 내에 페이지를 새로 고치거나 요청하지 않으면 세션이 종료됩니다.



0

를 사용 Session.Clear()하는 것보다 사용 하는 것이 편리하다고 생각합니다 Session.Abandon().

값은 나중에 호출 한 후에도 세션에 여전히 존재하지만 전자를 호출하면 제거되기 때문입니다.


0
this code works and dont throw any exception:

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

여기서 주목해야 할 한 가지는 Session.Clear는 즉시 항목을 제거하지만 Session.Abandon은 현재 요청이 끝날 때 세션이 중단되도록 표시합니다. 이는 단순히 session.abandon 명령이 실행 된 직후에 코드의 값에 액세스하려고했다고 가정해도 여전히 거기에 있음을 의미합니다. 따라서 session.abandon 명령을 실행하고 즉시 세션에 대한 논리를 수행 한 후에도 코드가 작동하지 않는 경우 혼동하지 마십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.