【发布时间】:2018-08-27 00:35:14
【问题描述】:
以下是我在router/index.js 中的代码
Vue.use(Router)
let router = new Router({
mode: 'history',
routes: [
{
path: '/',
name: 'HelloWorld',
component: HelloWorld,
meta: {
guest: true
}
},
{
path: "/login",
name: "login",
component: LoginComponent,
meta: {
guest: true
}
},
{
path: "/secure",
name: "secure",
component: SecureComponent,
meta: {
requiresAuth: true
}
},
{
path: "/kelas",
name: "kelas",
component: KelasComponent,
meta: {
requiresAuth: true
}
}
]
})
router.beforeEach((to, from, next) => {
const record = to.matched.some(record => record.meta.requiresAuth);
console.log("record: ")
console.log(record)
if(record) {
console.log(localStorage.getItem('jwtToken'))
if (localStorage.getItem('jwtToken') == null) {
next({
path: '/login',
params: { nextUrl: to.fullPath }
})
} else {
next()
}
} else if(to.matched.some(record => record.meta.guest)) {
if(localStorage.getItem('jwtToken') == null){
next()
}
else{
next()
}
}else {
next()
}
})
export default router
在我的components/Login.vue 中有如下内容:
<template>
<section id="login">
<h1>Login</h1>
<form @submit="onSubmit">
<b-field label=""
type="is-warning"
message="Please enter a valid email">
<b-input type="email" name="email" v-model="input.email" placeholder="E-mail"></b-input>
</b-field>
<b-field label=""
type="is-warning"
message="Please enter your password">
<b-input type="password" name="password" v-model="input.password" placeholder="Password"></b-input>
</b-field>
<input type="password" name="password" v-model="input.password" placeholder="Password" />-->
<b-field :message="errors"
type="is-danger"
name="errors"
>
<!--<button type="button" v-on:click="login()" class="button">Login</button>-->
<button type="submit" class="button">Login</button>
</b-field>
</form>
</section>
</template>
<script>
import axios from 'axios'
export default {
name: 'Login',
data () {
return {
input: {
email: "",
password: ""
},
result : "",
errors: []
}
},
methods: {
onSubmit (evt) {
evt.preventDefault()
if(this.input.email != "" && this.input.password != "") {
axios.post('http://localhost:8081/api/auth/login', this.input)
.then(response => {
localStorage.setItem('user',JSON.stringify(response.data.user))
localStorage.setItem('jwtToken', response.data.token)
if (localStorage.getItem('jwtToken') != null){
this.$emit("authenticated", true)
this.$emit('loggedIn')
if(this.$route.params.nextUrl != null){
this.$router.push(this.$route.params.nextUrl)
}
else {
this.$router.push('secure')
}
}
})
.catch(e => {
console.log(e.response)
if(e.response.status === 401) {
this.errors.push("Invalid login")
}else{
this.errors.push(e)
}
})
} else {
this.result = "An email and password must be present"
console.log("An email and password must be present")
}
}
}
}
</script>
我上面的代码运行良好。在secure.vue 页面中,我可以单击打开kelas.vue 页面的按钮,没有任何问题。但是当我尝试刷新页面secure 或kelas 时,它会将我推回到页面login。
通过执行console.log,我可以看到jwttoken 和to.matched.some(record => record.meta.requiresAuth); 的值仍然存在;唯一的区别是当我重新加载时,router.beforeEach((to, from, next) => { 这一行的from 变为空。
有什么方法可以让用户在用户重新加载/刷新页面后仍然登录?似乎 vue 的“默认”行为是用户不打算重新加载/刷新页面。或者我在这里遗漏了什么?
【问题讨论】:
标签: vue.js passport.js