关闭浏览器触发监听器,向后端发送请求

1、需求前提

项目使用Vue + SpringBoot搭建的前后端分离项目,后端存储用户登录信息和Token。现在的需求是,多端只可以有一个用户登录,当一个用户关闭浏览器或者关闭标签页时,向后端发送请求删除该用户的登录信息,以此来解决用户及时下线的目的。

2、解决方案

直接上代码

mounted() {
    window.addEventListener('beforeunload', (e) => this.beforeUnload(e));
    // 添加关闭浏览器触发器
    window.addEventListener('unload', this.logout);
},
methods: {
    beforeUnload(e) {
      e = e || window.event;
      if (e) {
        e.returnValue = '关闭提示';
      }
      return '关闭提示';
    },
    // 关闭浏览器标签触发
    logout() {
      fetch('/login/loginOut?userId=admin'), {
        method: 'GET',
        headers: {'Content-Type': 'application/json'},
        keepalive: true
      });
    },

重点1:

window.addEventListener('beforeunload', (e) => this.beforeUnload(e));
// 点击 <button>离开</button> 按钮时触发
window.addEventListener('unload', this.logout);

重点2:

// 关闭浏览器标签触发
 logout() {
   fetch('/login/loginOut?userId=admin'), {
     method: 'GET',
     mode: 'no-cors',   // 重点一定要注意
     headers: {'Content-Type': 'application/json'},
     keepalive: true
   });
 },

可能你也观察到了,我使用了fetch请求,那是因为axios异步请求在这里不起作用!(PS: 浪费了好多时间。)
同时,fetch请求最大支持** 64KB**的请求体,所以注意传参的载荷。
同时如果是前后端分离项目,一定加上跨域设置 no-cors。否则部署线上则会出现跨域异常。
3、实际项目中的源码

mounted() {
    // 添加关闭浏览器触发器
    window.addEventListener('beforeunload', (e) => this.beforeUnload(e));
    window.addEventListener('unload', this.logout);
}
methods: {
	beforeUnload(e) {
	      e = e || window.event;
	      if (e) {
	        e.returnValue = '关闭提示';
	      }
	      return '关闭提示';
	},
	// 关闭浏览器标签触发
	logout() {
		  // 运行环境
		  let baseURL = process.env.VUE_APP_URL;
		  if (process.env.NODE_ENV === "production") {
		    baseURL = window.Glob.BaseUrl + process.env.VUE_APP_API;
		  }
		  fetch(baseURL + '/login/loginOut?userId=admin', {
		    method: 'GET',
		    mode: 'no-cors',
		    headers: {'Content-Type': 'application/json'},
		    keepalive: true
		  });
	},
}

问题:刷新和关闭浏览器标签时都会触发,暂时无法限制刷新页面不触发该事件,有想法的小伙伴请留言呢。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值