a

Câu hỏi Điều gì sẽ xảy ra khi tôi nhấp vào nút Dừng trên trình duyệt?


Giả sử tôi nhấp vào nút trên trang web để bắt đầu yêu cầu gửi. Sau đó, tôi đột nhiên nhận ra rằng một số dữ liệu tôi cung cấp là sai và nếu nó được gửi, thì tôi sẽ phải đối mặt với những hậu quả không mong muốn (một thứ như yêu cầu mua sắm nơi tôi có thể bị buộc phải trả tiền cho yêu cầu không chính xác này).

Vì vậy, tôi điên cuồng bấm vào nút Stop không chỉ một lần mà nhiều lần (chỉ trong trường hợp).

Điều gì xảy ra trong kịch bản như vậy? Trình duyệt có hủy yêu cầu mà không thông báo cho máy chủ không? Nếu trong trường hợp nó không thông báo cho máy chủ, máy chủ chỉ cần giết quá trình hoặc thực hiện nó cũng làm một số cán trở lại của tất cả các hành động thực hiện như là một phần của yêu cầu này?

Tôi viết mã bằng Java. Java có bất kỳ tính năng đặc biệt nào mà chúng ta có thể sử dụng để phát hiện các yêu cầu STOP và khôi phục bất kỳ điều gì chúng ta đã làm như một phần của giao dịch này không?


24
2017-09-26 07:14


gốc




Các câu trả lời:


Tải trang web từ trình duyệt thường là quy trình 4 bước (không xem xét chuyển hướng):

  1. Trình duyệt gửi Yêu cầu HTTP, khi Máy chủ khả dụng
  2. Máy chủ thực hiện mã (đối với các trang động)
  3. Máy chủ gửi Phản hồi HTTP (thường là HTML)
  4. Trình duyệt hiển thị HTML và yêu cầu các tệp khác (hình ảnh, css, ...)

Phản ứng của trình duyệt đối với "Dừng" phụ thuộc vào bước mà yêu cầu của bạn vào lúc đó:

  • Nếu máy chủ của bạn bị chậm hoặc quá tải, và bạn nhấn "Dừng" trong bước 1, không có gì xảy ra. Trình duyệt không gửi yêu cầu.
  • Hầu hết thời gian, tuy nhiên, "Dừng" sẽ được nhấn vào các bước 2, 3 và 4 và trong các bước đó, mã của bạn đã được thực thi, trình duyệt chỉ dừng trả lời (2) hoặc nhận phản hồi (3) hoặc hiển thị phản hồi (4).

Bản thân cuộc gọi HTTP luôn là hành động 2 bước (Yêu cầu / Trả lời) và không có cách tự động nào để khôi phục lại việc thực thi từ máy khách


21
2017-09-26 07:34





Vì câu hỏi này có thể thu hút sự chú ý cho những người không sử dụng Java, tôi nghĩ tôi sẽ đề cập đến hành vi của PHP liên quan đến câu hỏi này, vì nó rất đáng ngạc nhiên.

PHP nội bộ duy trì trạng thái kết nối với máy khách. Các giá trị có thể là NORMAL, ABORTED và TIMEOUT. Trong khi trạng thái kết nối là NORMAL, cuộc sống là tốt và kịch bản sẽ tiếp tục thực hiện như mong đợi.

Nếu người dùng nhấp vào nút Dừng trong trình duyệt của họ, kết nối thường được đóng bởi khách hàng và trạng thái thay đổi thành ABORTED. Thay đổi trạng thái thành ABORTED sẽ ngay lập tức kết thúc thực thi tập lệnh đang chạy. Ngoài ra, điều tương tự cũng xảy ra khi trạng thái thay đổi thành TIMEOUT (cài đặt PHP cho thời gian chạy tập lệnh được phép vượt quá).

Hành vi này có thể hữu ích trong một số trường hợp nhất định, nhưng có những hành vi khác có thể có vấn đề. Có vẻ như là an toàn để hủy bỏ bất cứ lúc nào trong một yêu cầu GET thích hợp; tuy nhiên, việc hủy bỏ ở giữa yêu cầu thực hiện thay đổi trên máy chủ có thể dẫn đến những thay đổi hoàn toàn một phần.

Kiểm tra mục nhập của hướng dẫn sử dụng PHP về Xử lý kết nối để xem cách tránh các biến chứng do hành vi này gây ra:

http://www.php.net/manual/en/features.connection-handling.php


12
2017-09-26 07:20





Nói chung, máy chủ sẽ không biết rằng bạn đã nhấn dừng và quá trình phía máy chủ sẽ hoàn tất. Tại thời điểm máy chủ cố gắng gửi dữ liệu phản hồi cho khách hàng, bạn có thể thấy một lỗi vì kết nối đã bị đóng, nhưng không kém bạn có thể không. Những gì bạn sẽ không nhận được là các thread máy chủ bị đột ngột bị gián đoạn.

Bạn có thể sử dụng các cơ chế phức tạp khác nhau để giảm thiểu điều này, như gửi lệnh gửi các cuộc gọi ajax thường xuyên đến máy chủ có nội dung "vẫn đang chờ" và yêu cầu máy chủ thực hiện xử lý trong chuỗi mới để kiểm tra các cuộc gọi này, nhưng điều đó không giải quyết được vấn đề hoàn toàn.


3
2017-09-26 07:22





Máy khách sẽ ngay lập tức ngừng truyền dữ liệu và đóng kết nối của nó. 9 trong số 10 lần yêu cầu của bạn sẽ có được thông qua (có lẽ do bộ đệm hệ điều hành được "xả" đến máy chủ). Không có thông tin bổ sung nào được gửi đến máy chủ thông báo rằng bạn đã dừng yêu cầu của mình.


1
2017-09-26 07:25



Nếu điều này xảy ra trong khi kết nối tcp trực tiếp với máy chủ, trình duyệt có gửi lại cài đặt không? - seand


Việc bạn gửi trong các tình huống quan trọng cần có hai giai đoạn. Xác minh và gửi. Tuy nhiên, nếu lần gửi cuối cùng, bạn thực hiện bất kỳ giao dịch nào. Tôi không thể nghĩ ra bất kỳ cách nào khác thực sự để tránh tình huống đó, ngoài việc cho phép người dùng của bạn hoàn tác hành động của mình sau khi cam kết. ví dụ Ví dụ đơn đặt hàng, sau khi lệnh được thực hiện để cho phép khách hàng của bạn thay đổi quyết định của họ và canel đơn đặt hàng nếu đơn hàng chưa được giao. Tất nhiên mã phụ của nó, bạn cần phải viết để suuport đó.


0