【问题标题】:Best way to detect browser closing/navigation to other page and do logout检测浏览器关闭/导航到其他页面并注销的最佳方法
【发布时间】:2009-05-20 15:02:48
【问题描述】:

我正在用 GWT 编写一个应用程序,我需要检测用户何时离开我的应用程序或何时关闭浏览器窗口(onUnload 事件)并执行注销(会话失效和其他一些清理任务)。注销操作由 servlet 执行。

我目前正在通过挂钩 onUnload() 事件并打开一个指向注销 servlet 的新窗口来执行此操作。

有没有更好的方法来做到这一点?欢迎任何其他建议。

【问题讨论】:

  • 这个问题的重复。 stackoverflow.com/questions/875380/…
  • 那个问题不是这个问题的重复。
  • 答案确实回答了这个问题 - 您无法判断用户何时停止使用您的网站。您可以做的最接近的方法是判断用户在给定的时间段内何时没有向网站发送新请求。

标签: javascript gwt logout onunload


【解决方案1】:

看起来 GWT 确实为此举办了一个活动。

ClosingEvent.

看起来你需要实现一个ClosingHandler

【讨论】:

  • 您应该能够在处理程序中向您的服务器发送最后一个注销请求。
  • 我刚刚运行了一个快速测试来创建一个 ClosingHandler 并注册它。我做了一个简单的,只显示一个警报。当关闭选项卡/窗口以及我浏览应用程序外的另一页时,该代码将被触发。
  • 我知道这个 WindowCloseListener(相当于 GWT 1.5 中的 ClosingEvent),但假设由于 RequestCallback 对象是发出请求的必需对象,它可能会导致回调事件出现一些问题。但是我尝试使用 RequestCallback 对 onResponseReceived 事件什么都不做,它工作正常。感谢您的回复。
  • 这样的答案正是不允许仅链接到信息的原因。这两个都坏了。
【解决方案2】:

为什么不创建一个非常短暂的会话 cookie,它会在每次页面加载时重置,然后添加一个跟踪 cookie。当用户返回时,您会注意到跟踪 cookie,但没有会话 cookie。使会话到期并在此时清除所有内容。

当它阻止 onUnload 窗口打开时,弹出窗口阻止程序会阻止您的会话清理,因为这是垃圾邮件发送者使用的东西。

【讨论】:

    【解决方案3】:

    这是结束事件的工作方式:

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

    然后 GWT 让用户有机会说是或否。当然,您也可以在其中添加一个测试,看看他们是否有任何未保存的数据或您想要的任何数据。不设置消息或将其设置为 null 不会执行任何操作。

    【讨论】:

      【解决方案4】:

      做到这一点的方法是像@Carnell 和@BillLyons 所说的那样使用Window.addWindowClosingHandler。但是我使用了一种额外的技术来检测浏览器是否已关闭或页面是否被再次访问(通过刷新或返回导航)。

      接下来有一个实用程序类可以帮助您。只需在您的onModuleLoad 中调用以下行进行测试。

      使用示例

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

      实用程序类

      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;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-27
        • 2021-09-10
        • 2011-12-03
        • 1970-01-01
        • 2017-01-05
        • 1970-01-01
        相关资源
        最近更新 更多