用户单击注销按钮时可以注销自己,但如果令牌已过期,则他/她将无法注销,因为在我的应用程序中,服务器端和前端都使用了令牌。当用户单击注销按钮时,如果令牌有效,则会清除来自服务器和浏览器的令牌。当用户未注销并且其令牌过期但未在浏览器中清除时,很有可能会出现。为了解决这种情况,我如何在用户每次访问我的应用程序时检查令牌是否到期,因此,如果令牌已过期,请从浏览器中清除令牌?
我尝试过在saga中进行尝试,每次用户刷新页面或切换到另一页面时,它都会在后台监视。我认为这不是一种有效的方法。我认为中间件正在发挥作用。
function* loadInitialActions() { var dateNow = new Date(); console.log(jwtDecode(token).exp < dateNow.getTime() - jwtDecode(token).iat); const token = JSON.parse(localStorage.getItem("user")) && JSON.parse(localStorage.getItem("user"))["token"]; if ( token && jwtDecode(token).exp < dateNow.getTime() - jwtDecode(token).iat ) { yield put(LOGOUT_SUCCESS); } } function* initialize() { const watcher = yield fork(loadInitialActions); yield take([INITIALIZE_ERROR, INITIALIZE_SUCCESS]); yield cancel(watcher); } function* rootSaga() { console.log("rootSaga"); yield takeLatest(INITIALIZE, initialize); }
所以我的问题是,如果令牌从中间件过期,我该如何使用令牌到期逻辑和注销用户?
在我看来,中间件将是最佳选择。
你可以做这样的事情
const checkTokenExpirationMiddleware = store => next => action => { const token = JSON.parse(localStorage.getItem("user")) && JSON.parse(localStorage.getItem("user"))["token"]; if (jwtDecode(token).exp < Date.now() / 1000) { next(action); localStorage.clear(); } next(action); };
然后您必须将其包装 applyMiddleware
applyMiddleware