Sự khác biệt giữa Session.Abandon () và Session.Clear ()


109

Sự khác biệt giữa việc hủy một phiên và xóa các giá trị của nó là gì? Bạn có thể vui lòng cung cấp một ví dụ chứng minh điều này?

Tôi đã tìm kiếm câu hỏi này, nhưng không nắm được câu trả lời tổng thể. Một số câu trả lời là:

  • Session.Abandon() phá hủy phiên
  • Session.Clear() chỉ xóa tất cả các giá trị

Một người bạn đã nói với tôi điều này:

Việc xóa phiên sẽ không hủy đặt phiên, phiên đó vẫn tồn tại với cùng một ID cho người dùng nhưng với các giá trị được xóa đơn giản.

Việc hủy bỏ sẽ hủy phiên hoàn toàn, có nghĩa là bạn cần bắt đầu phiên mới trước khi có thể lưu trữ thêm bất kỳ giá trị nào trong phiên cho người dùng đó.

Đoạn mã dưới đây hoạt động và không có bất kỳ ngoại lệ nào.

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

Khi bạn Bỏ qua () một Phiên, bạn (hay đúng hơn là người dùng) sẽ nhận được SessionId mới

Khi tôi kiểm tra Phiên, nó không tạo ra bất kỳ thay đổi nào khi tôi Bỏ qua phiên.

Tôi chỉ tìm thấy một điểm khác biệt: session.Abandon()tăng Session_Endsự kiện


5
Session.Clear xóa các mục ngay lập tức nhưng Session.Abandon đánh dấu phiên bị bỏ qua khi kết thúc yêu cầu hiện tại.
RepDbg

Câu trả lời:


147

Xóa - Xóa tất cả các khóa và giá trị khỏi bộ sưu tập trạng thái phiên.

Bỏ qua - loại bỏ tất cả các đối tượng được lưu trữ trong một Phiên. Nếu bạn không gọi phương thức Abandon một cách rõ ràng, máy chủ sẽ loại bỏ các đối tượng này và hủy phiên khi phiên hết thời gian.
Nó cũng tăng các sự kiện như Session_End .

Session.Clear có thể được so sánh với việc loại bỏ tất cả sách khỏi giá , trong khi Session.Abandon giống như vứt bỏ toàn bộ giá sách .

Bạn nói:

Khi tôi kiểm tra Phiên, nó không tạo ra bất kỳ thay đổi nào khi tôi Bỏ qua phiên.

Điều này đúng khi bạn chỉ thực hiện trong một yêu cầu .
Trong yêu cầu tiếp theo, phiên sẽ khác. Nhưng ID phiên có thể được sử dụng lại để id vẫn giữ nguyên.

Nếu bạn sử dụng Session.Clear, bạn sẽ có cùng một phiên trong nhiều yêu cầu.

Nói chung, trong hầu hết các trường hợp, bạn cần sử dụng Session.Clear.
Bạn có thể sử dụng Session.Abandon nếu bạn chắc chắn rằng người dùng sẽ rời khỏi trang web của bạn.

Vì vậy, quay lại sự khác biệt:

  1. Việc bỏ qua làm tăng yêu cầu Session_End.
  2. Clear loại bỏ các mục ngay lập tức, Abandon thì không.
  3. Bỏ phát hành đối tượng SessionState và các mục của nó để nó có thể thu thập rác để giải phóng tài nguyên. Clear giữ SessionState và các tài nguyên được liên kết với nó.

và nếu tôi gọi session.clear (), bạn sẽ thông báo lại với accures. không phải? (tất cả những thứ khác nâng cao sự kiện Session_End)
backdoor

Session.Clear sẽ chỉ xóa các mục khỏi Session. Chỉ có bấy nhiêu thôi. Bạn có thể gọi nó nhiều lần nếu cần.
Dmytrii Nagirniak 24/09/09

@AnthonyWJones, bạn nói đúng "tiêu diệt" là không chính xác để nói. Tốt hơn là LOẠI BỎ các đối tượng khỏi phiên. Nhưng Session.Clear cũng không phá hủy các đối tượng, nó loại bỏ thm khỏi phiên để chúng có thể được thu thập. Ngoài ra, việc lưu trữ các đối tượng COMPLEX cũng không được khuyến khích, nếu không thì tôi cho là ổn.
Dmytrii Nagirniak 24/09/09

@Dmitriy: Tại sao "không nên lưu trữ các đối tượng COMPLEX"?
Kamarey 24/09/09

5
@Ads Tôi đồng ý, mặc dù tôi sẽ mở rộng nó bằng cách nói rằng điều đó Session.Clearcó thể được so sánh với việc loại bỏ tất cả sách khỏi giá ngay lập tức , trong khi Session.Abandongiống như nói "vứt toàn bộ giá đi và cho tôi biết khi bạn hoàn thành ".
WynandB

20

Khi bạn Abandon()là một Phiên, bạn (hay đúng hơn là người dùng) sẽ nhận được một SessionId mới (trong yêu cầu tiếp theo). Khi bạn Clear()một Phiên, tất cả các giá trị được lưu trữ sẽ bị xóa, nhưng SessionId vẫn nguyên vẹn.


3
cảm ơn. nhưng việc đăng ký vào sách Macdonalds mờ, nó có thể sử dụng cùng một id phiên. i có nghĩa là nếu regenerateExpiredSessionId thuộc tính ở cấu hình phần tử / system.web / sessionState trong file web.config là sai ASP.Net sử dụng phiên id cũ
backdoor

2
@Hans Kesting Anh ấy sẽ không nhận được Id phiên mới khi lệnh bỏ qua được gọi. Anh ta phải đặt cookie ASPNET_SessionID một cách rõ ràng thành null để có được ID phiên mới.
Zo Có

9

Đây là loại được đề cập bởi các phản hồi khác nhau ở trên, nhưng lần đầu tiên tôi đọc bài viết này, tôi đã bỏ lỡ một sự thật quan trọng, dẫn đến một lỗi nhỏ trong mã của tôi ...

Session.Clear() sẽ XÓA các giá trị của tất cả các khóa nhưng sẽ KHÔNG gây ra sự kiện kết thúc phiên để kích hoạt.

Session.Abandon()sẽ KHÔNG xóa các giá trị trên yêu cầu hiện tại. NẾU một trang khác được yêu cầu, các giá trị sẽ không còn cho trang đó. Tuy nhiên, bỏ SẼ ném sự kiện.

Vì vậy, trong trường hợp của tôi (và có lẽ trong trường hợp của bạn?), Tôi cần Clear()theo sau Abandon().


1
Tại sao bạn cần Session.Clear () theo sau bởi Session.Abandon ()? Bạn đang xóa các giá trị của một bộ sưu tập mà bạn đang phá hủy? Điều này là hoàn toàn thừa. Chắc chắn rằng đối tượng phiên không bị hủy ngay lập tức (điều đó xảy ra ở cuối yêu cầu hiện tại), nhưng id phiên đó sẽ không còn được phục vụ bởi bất kỳ yêu cầu tiếp theo nào. Nếu khách hàng thực hiện một yêu cầu mới, một phiên mới sẽ được cung cấp cho họ. Việc gọi Clear trước tiên cũng sẽ gây ra sự cố nếu bạn muốn truy cập bất kỳ biến phiên nào trong sự kiện Session_End () của Global.Asax (chúng sẽ không ở đó vì bạn đã xóa chúng).
RepDbg

@RepDbg thực sự tôi không đồng ý. Session.Abandon (). cung cấp cho khách hàng một id phiên mới. Session.clear gạt bỏ tất cả các thông tin trên máy chủ về phiên vì vậy không những người dùng khác can.I đồng ý với NRC
Micah Armantrout

@ Micah Armantrout Tôi không tuân theo logic của bạn. Tại sao xóa một phiên bằng Session.Clear (), sau đó gọi Session.Abandon () không chỉ xóa phiên mà còn hoàn toàn phân bổ nó? Ngoài ra Session.Abandon () không cung cấp cho máy khách một id phiên mới. Một yêu cầu tiếp theo sẽ, nhưng không thực hiện yêu cầu được gọi là Session.Abandon ().
RepDbg

Nếu bạn chỉ sử dụng Session.Abandon, các logic còn lại khác trong đường dẫn ASP.NET vẫn có thể truy cập các giá trị phiên hiện tại.
Mark Sowul

6

mã này hoạt động và không ném bất kỳ ngoại lệ nào:

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

Đó là bởi vì khi phương thức Abandon được gọi, đối tượng Session hiện tại được xếp hàng đợi để xóa nhưng không thực sự bị xóa cho đến khi tất cả các lệnh script trên trang hiện tại được xử lý. Điều này có nghĩa là bạn có thể truy cập các biến được lưu trữ trong đối tượng Session trên cùng một trang với lệnh gọi phương thức Abandon nhưng không phải trong bất kỳ trang Web nào tiếp theo.

Ví dụ, trong đoạn script sau, dòng thứ ba in ra giá trị Mary. Điều này là do đối tượng Session không bị phá hủy cho đến khi máy chủ xử lý xong tập lệnh.

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

Nếu bạn truy cập biến MyName trên một trang Web tiếp theo, nó sẽ trống. Điều này là do MyName đã bị hủy với đối tượng Session trước đó khi trang chứa ví dụ trước đó hoàn tất quá trình xử lý.

từ MSDN Session.Abandon


3

Xóa phiên sẽ xóa các giá trị đã được lưu trữ ở đó, nhưng bạn vẫn có thể thêm các giá trị mới vào đó. Sau khi hủy phiên, bạn không thể thêm các giá trị mới vào đó.


cảm ơn nhưng điều này hoạt động: (không phù hợp với ý tưởng của bạn) Session.Abandon (); Phiên ["tempKey1"] = "tempValue1"; Response.Write (Session ["tempKey1"]. ToString ());
backdoor

Điều này xảy ra vì phiên sẽ bị hủy sau khi bạn làm mới trang của mình thực sự. Id phiên nó (thường) được lưu trữ trong cookie.
RaYell 24/09/09

tôi không hiểu. ý tôi là sau khi tôi gọi Session.Abandon () tôi vẫn có thể thêm các giá trị vào nó. (ngay cả khi trang được đăng đi đăng lại nhiều lần).
backdoor

1
Bạn có thể đặt phiên của bạn thành id tự động tạo sau khi nó bị hủy. Vì vậy, khi bạn gán một giá trị cho phiên bị hủy thì phiên mới sẽ được tạo tự động.
RaYell 24/09/09

1
vâng, sử dụng id phiên này sẽ tạo lại nhưng câu hỏi của tôi là: sự khác biệt giữa session.clear () và session.abandone () là gì. theo cách này khi tự động tạo lại được đặt thành false, những câu trả lời này không khác gì trong việc nâng cao Sesion_End?
backdoor,

3

clear-nó xóa khóa hoặc giá trị khỏi bộ sưu tập trạng thái phiên ..

từ bỏ-loại bỏ hoặc xóa các đối tượng phiên khỏi phiên ..


1
Session.Abandon() 

sẽ hủy / giết toàn bộ phiên.

Session.Clear()

loại bỏ / xóa dữ liệu phiên (tức là các khóa và giá trị từ phiên hiện tại) nhưng phiên sẽ vẫn tồn tại.

So sánh với phương thức Session.Abandon (), Session.Clear () không tạo phiên mới, nó chỉ biến tất cả các biến trong phiên thành NULL.

ID phiên sẽ vẫn giữ nguyên trong cả hai trường hợp, miễn là trình duyệt không bị đóng.

Session.RemoveAll()

Nó xóa tất cả các khóa và giá trị khỏi bộ sưu tập trạng thái phiên.

Session.Remove()

Nó xóa một mục khỏi bộ sưu tập trạng thái phiên.

Session.RemoveAt()

Nó xóa một mục tại một chỉ mục cụ thể khỏi bộ sưu tập trạng thái phiên.

Session.TimeOut()

Thuộc tính này chỉ định khoảng thời gian chờ được gán cho đối tượng Session cho ứng dụng. (thời gian sẽ được xác định bằng phút).

Nếu người dùng không làm mới hoặc yêu cầu một trang trong khoảng thời gian chờ, thì phiên sẽ kết thúc.



0

Tôi nghĩ nó sẽ tiện dụng Session.Clear()hơn là sử dụng Session.Abandon().

Bởi vì các giá trị vẫn tồn tại trong phiên sau khi gọi sau nhưng bị xóa sau khi gọi trước.


0
this code works and dont throw any exception:

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

Một điều cần lưu ý ở đây là Session.Clear loại bỏ các mục ngay lập tức nhưng Session.Abandon đánh dấu phiên bị bỏ qua khi kết thúc yêu cầu hiện tại. Điều đó đơn giản có nghĩa là giả sử bạn cố gắng truy cập giá trị trong mã ngay sau khi lệnh session.abandon được thực thi, nó sẽ vẫn ở đó. Vì vậy, đừng nhầm lẫn nếu mã của bạn không hoạt động ngay cả sau khi phát hành lệnh session.abandon và ngay lập tức thực hiện một số logic với phiên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.