2012-02-27 22 views
8

Gọi số isNew() trên đối tượng phiên, kiểm tra xem phiên có phải là phiên mới hoặc đã được sử dụng không?Làm thế nào để isNew() cho biết phiên là một phiên mới hoặc đã được sử dụng?

Tôi đọc rằng isNew() trả về true nếu khách hàng chưa phản hồi với ID phiên. Nhưng nó có nghĩa gì ? Vui lòng giải thích

+0

Câu hỏi của bạn là gì? –

+0

@ Andrew Logvinov xem chỉnh sửa –

+0

Đọc phần này để hiểu cách phiên hoạt động: http://stackoverflow.com/questions/3106452/how-do-servlets-work-instantiation-session-variables-and-multithreading – BalusC

Trả lời

20

Tôi đọc đó làNew() trả về true nếu khách hàng chưa phản hồi với ID phiên. Nhưng nó có nghĩa gì ?

Hãy xem xét máy chủ hiện đang xử lý yêu cầu. Có hai kịch bản đối với việc xử lý phiên.

  • Trong trường hợp phiên mới, phiên mới được tạo cho người dùng/máy khách bởi máy chủ. (Máy khách có thể đã không cung cấp id phiên trong yêu cầu, hoặc nó có thể đã cung cấp id phiên mà máy chủ cho là không hợp lệ.) Mã ứng dụng của servlet quyết định một phiên là bắt buộc (ví dụ vì nó có một số thông tin mà nó muốn lưu trữ ở đó) và cố gắng tìm nạp nó bằng cờ "tạo nếu không có mặt". Cơ sở hạ tầng servlet nhận ra rằng không có phiên làm việc hiện tại, tạo một phiên mới với id phiên mới và lưu nó trong kho phiên. Khi hoàn thành yêu cầu, id phiên được trả lại cho khách hàng; ví dụ. dưới dạng cookie hoặc dưới dạng URL có id phiên được đính kèm.

  • Trong kịch bản phiên hiện tại, ứng dụng khách đã bao gồm id phiên trong yêu cầu; ví dụ. dưới dạng cookie phiên hoặc dưới dạng id phiên trong URL yêu cầu. Cơ sở hạ tầng servlet nhận ra id này, tìm kiếm nó trong kho lưu trữ session của nó và (nếu cần) tái tạo đối tượng HttpSession chứa trạng thái phiên được truy xuất từ ​​kho phiên. Khi mã ứng dụng của servlet cố gắng truy cập phiên, nó nhận đối tượng HttpSession này, không phải là một đối tượng mới. Trạng thái phiên có thể được servlet sử dụng và cập nhật khi nó xử lý yêu cầu.

Trong kịch bản đầu tiên, gọi isNew() trên đối tượng session sẽ trở lại true bởi vì đây là một phiên mới.

Trong trường hợp thứ hai, gọi isNew() trên đối tượng phiên sẽ trả lại false vì đây KHÔNG phải là phiên mới.

Cách gọi làNew() trên đối tượng phiên, kiểm tra xem phiên có phải là phiên mới hoặc đã được sử dụng không?

Cơ sở hạ tầng servlet biết trường hợp nào xảy ra do tạo phiên hoặc tra cứu phiên. Việc triển khai rõ ràng nhất của isNew() là bao gồm trường private boolean trong đối tượng HttpSession và trả về giá trị của trường đó là kết quả của isNew(). Trường sẽ được khởi tạo bởi cơ sở hạ tầng servlet theo cách nó thu được đối tượng phiên làm việc.

+2

tôi chưa hiểu một phần câu trả lời của bạn. Bạn có thể làm cho các điểm rõ ràng hơn không. –

+3

Tôi hoàn toàn hiểu mọi phần của câu trả lời của bạn, cảm ơn bạn đã viết nó xuống. – user1884155

Các vấn đề liên quan