在Laravel中,用户保持非活动状态x分钟后,会话过期并注销。但是,他仍然可以在应用程序中,直到他刷新页面或转到另一条路由。
是否有办法在会话到期后自动将他重定向到登录页面,而无需刷新页面?
据我所知,我必须用Ajax请求来做,但我不确定如何。这是我搜索了一段时间后发现的:
$.ajax({
url:url,
type:"POST", // or get
data:parameters,
error: function(xhr, type, error){
window.location.replace("/login");
}
});
您可以在用户登陆具有会话生存期的页面时启动超时,并请求检查用户是否仍在登录
// 4 hours
let sessionLifetime = 4 * 60 * 60;
setTimeout(() => {
// an authenticated endpoint, could be anything, if request fail, then user is not logged in anymore
axios.get('/me').catch(e => {
window.location.replace("/login");
})
}, sessionLifetime * 1000);
唯一的缺点是,通过发出请求,您刷新会话,所以如果请求通过,您只需要重新启动超时:
// 4 hours
let sessionLifetime = 4 * 60 * 60;
let isAuth = () => {
// an authenticated endpoint, could be anything, if request fail, then
user is not logged in anymore
axios.get('/me').then(() => {
setTimeout(isAuth, sessionLifetime * 1000)
}).catch(e => {
window.location.replace("/login");
})
}
setTimeout(isAuth, sessionLifetime * 1000)
您可以为该检查创建一个专用端点,而不是使用随机端点。这里我使用axios, jquery也是一样的原理$.ajax
另一种解决方案是假设用户在超时执行时不再登录,而不检查请求,但这更有风险,因为用户可以打开另一个选项卡