2009-05-20 16 views
8

Tôi đang viết một ứng dụng trong GWT và tôi cần phát hiện khi người dùng điều hướng khỏi ứng dụng của tôi hoặc khi anh ta đóng cửa sổ trình duyệt (onUnload event) và làm đăng xuất (vô hiệu phiên và một số tác vụ dọn dẹp khác). Hành động đăng xuất được thực hiện bởi một servlet.Cách tốt nhất để phát hiện trình duyệt đóng/điều hướng đến trang khác và đăng xuất

Tôi hiện đang làm điều này bằng cách gắn vào sự kiện onUnload() và mở một cửa sổ mới được trỏ tới servlet đăng xuất.

Có cách nào tốt hơn để thực hiện việc này không? Những đề nghị khác dều được hoan nghênh.

+0

Duplicate của câu hỏi này. http://stackoverflow.com/questions/875380/how-to-tell-the-difference-between-a-page-refresh-and-closing-a-page –

+1

Câu hỏi đó không trùng lặp với câu hỏi này. –

+0

Câu trả lời không trả lời câu hỏi này mặc dù - bạn không thể biết khi nào người dùng đã ngừng sử dụng trang web của bạn. Việc gần nhất bạn có thể làm là cho biết khi nào người dùng chưa gửi yêu cầu mới đến trang web trong một khoảng thời gian nhất định. – Quentin

Trả lời

5

Có vẻ như GWT không có sự kiện cho chính xác điều này.

ClosingEvent.

Hình như bạn cần phải thực hiện một ClosingHandler

+0

Bạn sẽ có thể gửi một yêu cầu đăng xuất cuối cùng đến máy chủ của bạn trong trình xử lý của bạn. – Carnell

+0

Tôi vừa chạy một bài kiểm tra nhanh để tạo ClosingHandler và đăng ký nó. Tôi đã thực hiện một đơn giản chỉ hiển thị một cảnh báo. Mã đang bị kích hoạt khi tab/cửa sổ bị đóng cũng như khi tôi duyệt đến một trang khác bên ngoài ứng dụng. – Carnell

+1

Tôi biết về WindowCloseListener này (tương đương với ClosingEvent trong GWT 1.5), nhưng giả định rằng vì một đối tượng RequestCallback là bắt buộc để thực hiện một Yêu cầu, nó có thể gây ra một số vấn đề về các sự kiện gọi lại.Nhưng tôi đã thử với một RequestCallback không làm gì trên sự kiện onResponseReceived, và nó hoạt động tốt. Cảm ơn bạn đã phản hồi. –

2

Tại sao không chỉ tạo một cookie phiên chạy rất ngắn được đặt lại với mỗi lần tải trang, sau đó thêm cookie theo dõi. Khi người dùng trả về, bạn nhận thấy cookie theo dõi nhưng không có cookie phiên. Hết hạn phiên và xóa mọi thứ tại thời điểm đó.

Trình chặn cửa sổ bật lên sẽ ngăn chặn phiên của bạn dọn sạch khi chặn cửa sổ onUnload mở, vì đây là điều gì đó mà người gửi spam sử dụng.

1

Đây là cách trong lễ bế mạc hoạt động:

Window.addWindowClosingHandler(new Window.ClosingHandler() 
{ 
@Override 
public void onWindowClosing(ClosingEvent event) 
{ 
    event.setMessage("Are you sure?"); 
} 
}); 

Sau đó GWT cung cấp cho người dùng một cơ hội để nói có hoặc không. Tất nhiên bạn cũng có thể thêm một thử nghiệm trong đó để xem họ có bất kỳ dữ liệu chưa được lưu hay bất cứ thứ gì bạn muốn. Không cài đặt tin nhắn hoặc thiết lập nó thành null không làm gì cả.

0

Cách để làm điều đó là sử dụng số Window.addWindowClosingHandler như @Carnell và @BillLyons cho biết. Nhưng tôi sử dụng một kỹ thuật bổ sung để phát hiện xem trình duyệt có bị đóng hay không nếu trang đó được truy cập lại (bằng cách làm mới hoặc điều hướng quay lại).

Sau đây là một lớp tiện ích có thể giúp bạn. Chỉ cần gọi các dòng bên dưới trong số onModuleLoad của bạn để kiểm tra.

Việc sử dụng ví dụ:

@Override 
public void onModuleLoad() { 
    if (BrowserCloseDetector.get().wasClosed()) { 
     GWT.log("Browser was closed."); 
    } 
    else { 
     GWT.log("Refreshing or returning from another page."); 
    } 
} 

Lớp tiện ích:

import com.google.gwt.user.client.Cookies; 
import com.google.gwt.user.client.Window; 

public class BrowserCloseDetector { 
    private static final String COOKIE = "detector"; 
    private static BrowserCloseDetector instance; 

    private BrowserCloseDetector() { 
     Window.addWindowClosingHandler(new Window.ClosingHandler() { 
      public void onWindowClosing(Window.ClosingEvent closingEvent) { 
       Cookies.setCookie(COOKIE, ""); 
      } 
     }); 
    } 

    public static BrowserCloseDetector get() { 
     return (instance == null) ? instance = new BrowserCloseDetector() : instance; 
    } 

    public boolean wasClosed() { 
     return Cookies.getCookie(COOKIE) == null; 
    } 
} 
Các vấn đề liên quan