I have a simple use case, where my application is using vue-router
and vuex
. Then store
contains a user
object which is null
in the beginning. After the user is validated from the server it sends back an user
object which contains a JWT
auth token which is assigned to the user
object in the store. Now lets assume that the user came back after 3 hours and tried to visit a route or perform any other action, considering that the auth token has expired by then, what would be the best way to check that(need to call axios post
to check it) and redirect user to the login
page. My app will have loads of components so I know I can write logic to check the token valid in the mounted
hook of each component but that would mean repeating it all of the components. Also I don't want to use the beforeEach
navigation guard because I cannot show any visual feedback to the user like checking...
or loading...
.
You can define a Global Mixin and use it via Vue.use(myMixin)
- then all Components will inherit this mixin. If you define a mounted
or probably better activated
hook on the mixin, it will be called on every component.
There you can use everything a component can do - this
will point to your component. And if the component also defines a hook itself, the mixin hook of the same type will run before the components own hook.
We used a little different solution - we have a single component which handles everything login-related, which exists outside of the router-view in the parent index.html. This component is always active and can hide the div router-view and overlay a loading message or a login-screen. For an intranet-application this component will also use polling to keep the session alive as long as the browser stays open.
You can load of your router-navigation to this component. - So a child-component which wants to trigger a router-navigation just sets a global reactive property navigateTo
which is watched by the top level authentication component. This will trigger an authentication check, possibly a login-workflow and after that the top-level component will call $router.push()
With this approach you have complete control over any navigation.