2012-06-12 30 views
5

Vì vậy, tôi đã gặp phải một chút vấn đề lạ, và tôi hy vọng có một số người làm quen với IE có thể làm sáng tỏ hành vi này. Công ty của tôi chạy một ứng dụng Lift thời gian thực. Chúng tôi sử dụng mô hình sao chổi cho giao tiếp thời gian thực giữa các trình duyệt và máy chủ, như là tiêu chuẩn với Lift. Cũng đáng chú ý: Trong trường hợp sao chổi không đồng bộ với máy chủ (do vấn đề kết nối hoặc khởi động lại máy chủ, bất kỳ thứ gì sẽ giết phiên trên máy chủ), máy chủ sẽ phản hồi yêu cầu sao chổi đó với document.location.reload(); để tải lại trang, bắt đầu một phiên mới, v.v.IE tiếp tục thực thi JS sau khi nhận được 302?

Bây giờ, để đảm bảo rằng đăng xuất xảy ra, chúng tôi có một url đặc biệt (/ session/logout) thực hiện tất cả các hoạt động dọn dẹp liên quan đến phiên rồi đưa bạn trở lại trang chủ của chúng tôi. Điều này có thể được kích hoạt bằng cách nhấp vào một liên kết tới URL đó hoặc máy chủ có thể cấp cho bạn 302 URL đó nếu bạn cố gắng thực hiện điều gì đó yêu cầu bạn phải đăng xuất. Đủ đơn giản, phải không? Trong hầu hết các trình duyệt, điều này hoạt động tuyệt vời vì luồng công việc trông giống như sau:

  1. tài khoản hoặc nhấp vào nút logout hoặc máy chủ sẽ gửi một 302/phiên/logout
  2. javascript thực hiện trên trang hiện tại dừng lại, vì vậy tất cả các sao chổi đều đóng cửa.
  3. Tải/phiên/số lượt truy cập của trình duyệt
  4. Trình duyệt nhận được tin nhắn 302 từ máy chủ (ký làm sạch phiên được thực hiện) để đưa người dùng đến trang chủ.
  5. Trình duyệt tải trang chủ.

Tuy nhiên, trong IE chúng ta đang thấy những hành vi sau đây:

  1. tài khoản hoặc nhấp vào nút logout hoặc máy chủ sẽ gửi một 302/phiên/logout
  2. trình duyệt bắt đầu tải/phiên/đăng xuất
  3. Đã nhận được tin nhắn 302 đã nhận từ máy chủ (biểu thị quá trình dọn dẹp phiên được thực hiện) để đưa người dùng đến trang chủ.
  4. Trình duyệt bắt đầu tải trang chủ.
  5. Sao chổi nhận một document.location.reload(); từ máy chủ bởi vì họ đã không bao giờ tắt của IE, tải của trang chủ được hủy bỏ, và trang hiện tại được nạp lại mà không cần người dùng đăng nhập.

này là hoàn toàn không mong muốn vì chúng tôi cần kết quả chính xác của/session/logout để tải - đặc biệt là trong trường hợp người dùng đang cố gắng làm điều gì đó mà họ không thể thực hiện khi họ đăng nhập (trong trường hợp đó 302 được trả lại từ đăng xuất sẽ trỏ đến bất cứ nơi nào ban đầu họ cố gắng đến).

Có ai gặp phải vấn đề này trước đây không? Bất kỳ lời khuyên nào về cách giải quyết vấn đề này?

+0

Phiên bản IE nào? Chế độ tiêu chuẩn hay không? – joshp

+0

IE 8 và IE 9, cả hai đều chạy ở chế độ tiêu chuẩn, thể hiện hành vi này. –

Trả lời

0

Tôi không biết gì về sao chổi, cụ thể, nhưng bạn nên rõ ràng hơn trong việc tắt sao chổi.

Tôi khuyên bạn nên chụp sự kiện window.onbeforeunload và tắt sao chổi một cách rõ ràng thay vì dựa vào trình duyệt để thực hiện công việc này cho bạn.

+0

Thật không may, không hoạt động.Có vẻ như vì IE đã quyết định nó không thực sự muốn đi đến một trang khác, onBeforeUnload không được gọi và tôi vẫn thấy hành vi tải lại. :( –