2010-02-01 7 views
16

Hãy xem xét trường hợp:Điều gì xảy ra khi tôi nhấn nút BACK của trình duyệt?

  1. Tôi đã truy cập trang của trang web được tạo bằng ASP.NET. Trang này là một trang aspx đơn giản có chứa các điều khiển máy chủ ASP.NET.

  2. Tôi đã nhấp vào liên kết đưa tôi đến một số trang khác trên cùng một trang web.

  3. Tôi đã nhấp vào nút BACK của trình duyệt.

CÂU HỎI: Điều gì xảy ra trong vòng đời của trang? Có phải tất cả các sự kiện xảy ra hay trình duyệt chỉ hiển thị phiên bản được lưu trong bộ nhớ cache của trang mà không thực hiện bất kỳ yêu cầu nào?

Trả lời

15

Tôi nghĩ câu trả lời hay nhất là: Nó phụ thuộc vào trình duyệt, đặc biệt là sau một bài đăng/đăng lại.

Trình duyệt cũ hơn được sử dụng để bật lên hộp thoại xác nhận với hiệu ứng "trang chứa dữ liệu POST sẽ được gửi lại" và bạn có thể tiếp tục (gửi lại) hoặc hủy. Vì mọi thứ xảy ra trong ASP.NET WebForms là một phần của phần tử FORM (ViewState, sự kiện, v.v.), điều này sẽ làm cho toàn bộ vòng đời được lặp lại. Tất nhiên, điều này không gây ra vấn đề gì với việc đệ trình trùng lặp, do đó, nhiều trang web phải đưa ra giải pháp cho vấn đề song công, và ngày nay hầu hết các trình duyệt chỉ tìm nạp trang từ bộ nhớ cache thay thế.

... Đó là trừ khi bạn ghi đè tiêu đề kiểm soát bộ nhớ cache và buộc trình duyệt không lưu trữ trang trong bộ nhớ cache. Rõ ràng, trong trường hợp đó, nó không thể được lấy ra từ bộ nhớ cache, vì vậy nó thường sẽ kết thúc được gửi lại. Nhưng, một lần nữa, nó phụ thuộc vào trình duyệt - ví dụ, một số trình duyệt sẽ không cho phép gửi lại qua SSL, vì vậy nếu đó là giao thức được sử dụng thì người dùng sẽ chỉ thấy thông báo cho biết trang đã hết hạn/không thể được hiển thị.

Nghĩ về nó, có lẽ một câu trả lời hay hơn là: Là một nhà thiết kế trang, bạn thực sự không thể phụ thuộc vào bất kỳ hành vi cụ thể nào từ trình duyệt của người dùng khi nhấn nút Quay lại. Nếu việc gửi trùng lặp có thể có tác dụng phụ tiêu cực (chẳng hạn như tính phí thẻ tín dụng hai lần), thì bạn cần thực hiện các biện pháp thích hợp để ngăn điều đó xảy ra. Đó là thực hành tốt anyway vì nó hoàn toàn có thể cho một người dùng chỉ đơn giản là kích đúp vào nút "gửi" một cách tình cờ.

+0

Tôi đồng ý với câu trả lời của Aaronaught. Tôi sẽ không cố gắng viết bất kỳ mã nào giả định rằng nút 'quay lại' sẽ hoạt động theo một cách nhất định trên tất cả các trình duyệt. – jessegavin

+0

Tôi nghĩ rằng bạn đã xem xét một kịch bản khác của việc sao lưu cùng một trang bằng cách sử dụng điều khiển và sau đó nhấn nút BACK ... Tôi có đúng không? – Manish

+0

@Manish: Vấn đề gì không nhất thiết là trang * hiện tại của người dùng có dữ liệu 'POST' hay không, nhưng có hay không trang * trước đó * (trang mà nút Quay lại sẽ đưa họ đến) có dữ liệu' POST' . Điều đó bao gồm cả hai kịch bản - quay trở lại từ một postback, và trở lại từ một trang mới khi trang trước đó có một postback (hoặc chỉ là 'POST'). – Aaronaught

0

thường tất cả các sự kiện sẽ xảy ra, nhưng nếu bạn có một trình duyệt uber hơn nó có thể xảy ra để hiển thị một trang lưu trữ bạn chỉ có thể đặt một breakpoint trong trang của bạn tải và xem nếu nó sẽ xảy ra

0

Trang sẽ được hiển thị từ Cache.

+0

Vì vậy, nếu tôi có Response.Cache.SetCacheability (HttpCacheability.NoCache) thiết lập, sẽ đánh lại làm cho trình duyệt để phát hành một Nhận yêu cầu trang khiêu dâm, hoặc thậm chí là một postback nếu đó là hành động cuối cùng của người dùng? – AaronLS

+0

có nó sẽ postback nếu bạn có Response.Cache.SetCacheability (NoCache) được thiết lập, nhưng đối với một số trang, bạn sẽ thấy cùng một nội dung. Thử sử dụng Response.Cache.SetCacheability (HttpCacheability.NoCache); Response.Cache.SetExpires (DateTime.Now-new TimeSpan (1,0,0)); Response.Cache.SetLastModified (DateTime.Now); Response.Cache.SetAllowResponseInBrowserHistory (sai); – Ravia

+0

Tôi nghĩ bạn sẽ nhận được thông báo "Trang hết hạn" thay vì trang, nhưng tôi nghĩ điều đó tùy thuộc vào trình duyệt. – Codesleuth

1

chúng tôi thậm chí còn cố gắng

Response.ExpiresAbsolute = DateTime.Parse("1/1/1980"); 
Response.AddHeader("cache-control", "no-store, must-revalidate, private"); 
Response.AddHeader("Pragma", "no-cache"); 

để giải quyết loại vấn đề