vue3 typescript项目当浏览器关闭时,用户退出登录

需求

当浏览器关闭时,用户退出登录,刷新时不变,要点:判断浏览器刷新还是关闭。
app.vue页面

ts代码

1.判断浏览器的类型

/**
 * 判断是360浏览器还是谷歌浏览器
 * @returns 360 true 谷歌false
 */
function checkChromeForNum() {
	var uas = navigator.userAgent.split(' ')
	for (var key in navigator.plugins) {
		if (navigator.plugins[key].filename == 'np-mswmp.dll') {
			return '360'
		}
	}
	return '谷歌'
}

/**
 * 判断浏览器的类型(edge浏览器、搜狗浏览器、qq浏览器、火狐浏览器)
 * @returns
 */
const checkChromeType = () => {
	var uas = navigator.userAgent.split(' ')
	for (var element in uas) {
		if (uas[element].toLowerCase().includes('edg')) {
			// ie浏览器
			return 'edge'
		} else if (uas[element].toLowerCase().includes('se') && !uas[element].toLowerCase().includes('qqbrowser')) {
			// 搜狗浏览器
			return 'sg'
		} else if (uas[element].toLowerCase().includes('qqbrowser')) {
			// qq浏览器
			return 'qq浏览器'
		} else if (uas[element].toLowerCase().includes('firefox')) {
			// 火狐浏览器
			return 'firefox'
		}
	}
}
/**
 * 其他浏览器设置为谷歌浏览器(妥协办法)
 * @returns
 */
export function isNumberBrowser() {
	if (checkChromeForNum() == '360') {
		return '360'
	} else {
		if (checkChromeType()) {
			return checkChromeType()
		} else {
			return '谷歌'
		}
	}
}

2.在浏览器关闭时判断进行刷新还是关闭,退出用户


onMounted(() => {
	window.addEventListener('beforeunload', e => beforeunloadHandler(e))
	window.addEventListener('unload', e => unloadHandler(e))
})

const beforeunloadHandler = (event: any) => {
	state.onbeforeTime = new Date().getTime()
}
const unloadHandler = (e: any) => {
	state.unloadTime = new Date().getTime()
	if (isNumberBrowser() === '360') {
		state.gapTime = 13
	} else if (isNumberBrowser() === '谷歌') {
		state.gapTime = 12
	} else if (isNumberBrowser() === 'edge') {
		state.gapTime = 13
	} else if (isNumberBrowser() === 'sg') {
		state.gapTime = 9
	} else if (isNumberBrowser() === 'qq浏览器') {
		state.gapTime = 9
	} else if (isNumberBrowser() === 'firefox') {
		state.gapTime = 9
	}
	localStorage.setItem('lastTimedsf', (state.unloadTime - state.onbeforeTime).toString())
	if (state.unloadTime - state.onbeforeTime < state.gapTime) {
		if (userStore.token) {
			//TODO: 进行退出登录请求 fetch方法(有小概率事件,没有请求退出方法,直接删除token了)
			fetch('/sys/logout', {
				method: 'POST',
				headers: { 'Content-Type': 'application/x-www-form-urlencoded', Authorization: userStore.token },
				// 在页面关闭时,仍进行请求
				keepalive: true
			})
			//TODO: 删除token;(若有refreshToken,在这里不删除refreshToken,当用户重新登录时,根据refreshToken判断用户是否退出成功)
		}
	}
	SessionStorage.removeItem('onbeforeTime')
}
// 在组件中监听页面的onload事件
window.onload = function () {
	window.document.onmousedown = () => {
		const lastTime_onload = new Date().getTime()
		localStorage.setItem('lastTime', lastTime_onload.toString())
	}
}
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值