2009-10-16 21 views
10

Yêu cầu cho trình duyệt hiển thị thông báo "trang này đã hết hạn" ở khắp mọi nơi khi người dùng nhấn nút quay lại là gì?hiển thị "trang web đã hết hạn" trên nút quay số

Một số cách thân thiện với người dùng để ngăn người dùng sử dụng nút quay lại trong ứng dụng web là gì?

+4

tốt hơn sẽ được để thiết kế ứng dụng của bạn để nút quay lại có ý nghĩa hợp lý. Tôi thấy nó tức giận khi tôi 'không được phép' để sử dụng nút quay lại. – Peter

+0

Peter, tôi đồng ý. Có những lúc (chẳng hạn như quy trình thanh toán của trang web thương mại điện tử) khi bạn có thể bị cám dỗ để ngăn người dùng quay trở lại. Tuy nhiên, có một giải pháp phía máy chủ tốt hơn cho vấn đề mà tôi đề xuất trong câu trả lời của tôi. –

+0

@Peter, tôi hoàn toàn đồng ý, nhưng tôi đang xử lý quy trình làm việc để nút quay lại không áp dụng ở đây. – mkoryak

Trả lời

9

Vâng, theo mặc định bất cứ khi nào bạn đang xử lý POST biểu mẫu, sau đó người dùng truy cập lại và sau đó làm mới thì họ sẽ thấy thông báo cho biết trình duyệt đang gửi lại dữ liệu. Nhưng nếu trang được đặt hết hạn ngay lập tức thì họ thậm chí sẽ không phải làm mới và họ sẽ thấy trang đã hết hạn khi họ quay lại.

Để tránh cả hai thư, có một vài điều cần thử:

1) Sử dụng biểu mẫu GET để thay thế. Nó phụ thuộc vào những gì bạn đang làm nhưng điều này không phải luôn luôn là một giải pháp tốt vì vẫn còn những hạn chế về kích thước trên một yêu cầu GET. Và thông tin được truyền trong chuỗi truy vấn không phải là tùy chọn an toàn nhất.

- hoặc -

2) Thực hiện chuyển hướng phía máy chủ đến một trang khác sau biểu mẫu POST.

Trông giống như một câu hỏi tương tự đã được trả lời ở đây:

Redirect with a 303 after POST to avoid "Webpage has expired": Will it work if there are more bytes than a GET request can handle?

Là một lựa chọn thứ ba ta có thể ngăn chặn người dùng từ đi trở lại trong trình duyệt của họ ở tất cả. Lần duy nhất tôi cảm thấy cần phải làm điều này là ngăn họ làm điều ngu ngốc như trả tiền hai lần. Mặc dù có các phương pháp phía máy chủ tốt hơn để xử lý điều đó. Nếu trang web của bạn sử dụng phiên thì bạn có thể ngăn họ thanh toán hai lần bằng cách tắt bộ nhớ cache đầu tiên trên trang thanh toán và cài đặt hết hạn ngay lập tức. Và sau đó bạn có thể sử dụng một lá cờ của một số loại được lưu trữ trong một phiên mà thực sự sẽ thay đổi hành vi của trang nếu bạn quay trở lại nó.

2

bạn cần phải thiết lập tùy chọn kiểm soát pragma-cache trong tiêu đề HTTP: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9

Tuy nhiên, từ quan điểm khả năng sử dụng xem, đây là cách tiếp cận nản đến vấn đề này. Tôi mạnh mẽ khuyến khích bạn tìm kiếm các tùy chọn khác.

ps: theo đề xuất của Steve, chuyển hướng qua GET là cách thích hợp (hoặc kiểm tra chuyển động trang bằng JS).

0

Tôi không chắc đây có phải là thực hành tiêu chuẩn hay không, nhưng tôi thường giải quyết vấn đề này bằng cách không gửi tiêu đề Vary cho chỉ IE. Trong Apache, bạn có thể đặt sau trong httpd.conf:

BrowserMatch MSIE force-no-vary 

Theo RFC:

Các Vary giá trị trường chỉ tập của trường yêu cầu-tiêu đề đó hoàn toàn xác định, trong khi phản hồi là mới, cho dù bộ nhớ cache có được phép sử dụng phản hồi để trả lời yêu cầu sau tiếp theo mà không cần xác nhận lại.

Hiệu quả thực tế là khi bạn "quay lại" đối với POST, IE chỉ cần tải trang từ bộ nhớ cache lịch sử. Không có yêu cầu nào ở phía máy chủ.Tôi có thể thấy điều này rõ ràng trong HTTPWatch.

Tôi rất muốn nghe các tác dụng phụ tiềm ẩn của phương pháp này.

1

Hãy thử sử dụng đoạn mã sau trong Page_Load

Response.Cache.SetCacheability(HttpCacheability.Private) 
+0

đây là .net cụ thể đúng không? – mkoryak

+0

vâng, theo như tôi biết – Jeremy

1

sử dụng một trong các cách sau trước khi session_start:

session_cache_expire(60); // in minutes 

ini_set('session.cache_limiter', 'private'); 

/Lưu ý:

Ngôn ngữ được PHP

+0

bao gồm ngôn ngữ nào sẽ hữu ích – mkoryak

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