Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在浏览器关闭时注销用户_Javascript_Angularjs - Fatal编程技术网

Javascript 如何在浏览器关闭时注销用户

Javascript 如何在浏览器关闭时注销用户,javascript,angularjs,Javascript,Angularjs,在这里,我想在用户关闭浏览器时注销。为此,我做了研发,发现当我们关闭浏览器时会触发以下代码 window.onbeforeunload = function() { myService.logout(); return 'Your own message goes here...'; } 在这里,当我尝试关闭浏览器时,此事件将触发,并使用户注销。但是这里的问题是当页面被重定向时,这个事件也会触发 我想使用此功能让用户注销。但它出错了。请帮助我完成此功能 但是这里的问题是当页面被重定向时

在这里,我想在用户关闭浏览器时注销。为此,我做了研发,发现当我们关闭浏览器时会触发以下代码

window.onbeforeunload = function() {
  myService.logout();
  return 'Your own message goes here...';
}
在这里,当我尝试关闭浏览器时,此事件将触发,并使用户注销。但是这里的问题是当页面被重定向时,这个事件也会触发

我想使用此功能让用户注销。但它出错了。请帮助我完成此功能

但是这里的问题是当页面被重定向时,这个事件也会触发

我猜这是你自己正在执行的重定向。如果是这样的话,为什么不使用一个全局变量来区分你的重定向和你客户的重定向呢?大概是这样的:

...
thisismyredirect = true; //before redirecting, set this variable
window.location = "http://www.yoururl.com";
...
onbeforeunload
事件中,检查此重定向是否由您执行。如果是,则无需调用
logout()
函数:

window.onbeforeunload = function() {
    if(!thisismyredirect) {
        myService.logout();
        return 'Your own message goes here...';
    }
}

另一个解决方案是使用。当用户登录时,您将sessionStorage变量设置为“true”,当用户注销时,您将其设置为“false”,当浏览器关闭时,该变量将从sessionStorage中删除。如果您需要在同一浏览器实例中的多个选项卡之间共享sessionStorage变量,那么发布了一个很好的示例

工作原理: 如果用户关闭浏览器或关闭所有打开的应用程序选项卡,则在15秒超时后,将触发注销

  • 它适用于多个打开的窗口
  • 服务器上没有额外的负载
  • F5/刷新没有问题

浏览器限制是我们在注销前需要15秒超时的原因。因为浏览器无法区分以下情况:浏览器关闭、选项卡关闭和选项卡刷新。浏览器将所有这些操作视为同一操作。因此,15秒超时就像一种解决方法,只捕获浏览器关闭或关闭所有打开的应用程序选项卡(并跳过刷新/F5)。

所以它不是一个单页应用程序?那么,如果你有两个窗口打开和关闭一个窗口呢?仍然要执行注销吗?是的,我的应用程序是web应用程序,即使打开了两个选项卡,我也要执行注销处理
$rootScope
中的
$destroy
事件,因为您正在使用angularjs@KoushikChatterjee你能给我一个示例代码吗?只是实现一个会话超时。你真的不知道用户何时“离开”。
tabOrBrowserStillAliveInterval;

constructor() {
  // system should logout if the browser or last opened tab was closed (in 15sec after closing)
  if (this.wasBrowserOrTabClosedAfterSignin()) {
    this.logOut();
  }

  // every 15sec update browserOrTabActiveTimestamp property with new timestamp
  this.setBrowserOrTabActiveTimestamp(new Date());
  this.tabOrBrowserStillAliveInterval = setInterval(() => {
    this.setBrowserOrTabActiveTimestamp(new Date());
  }, 15000);
}

signin() {
  // ...
  this.setBrowserOrTabActiveTimestamp(new Date());
}

setBrowserOrTabActiveTimestamp(timeStamp: Date) {
  localStorage.setItem(
    'browserOrTabActiveSessionTimestamp',
    `${timeStamp.getTime()}`
  );
}

wasBrowserOrTabClosedAfterSignin(): boolean {
  const value = localStorage.getItem('browserOrTabActiveSessionTimestamp');

  const lastTrackedTimeStampWhenAppWasAlive = value
    ? new Date(Number(value))
    : null;
  const currentTimestamp = new Date();
  const differenceInSec = moment(currentTimestamp).diff(
    moment(lastTrackedTimeStampWhenAppWasAlive),
    'seconds'
  );

  // if difference between current timestamp and last tracked timestamp when app was alive
  // is more than 15sec (if user close browser or all opened *your app* tabs more than 15sec ago)
  return !!lastTrackedTimeStampWhenAppWasAlive && differenceInSec > 15;
}