【问题标题】:vuejs user logged out if reload page如果重新加载页面,vuejs用户注销
【发布时间】: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 页面的按钮,没有任何问题。但是当我尝试刷新页面securekelas 时,它会将我推回到页面login

通过执行console.log,我可以看到jwttokento.matched.some(record =&gt; record.meta.requiresAuth); 的值仍然存在;唯一的区别是当我重新加载时,router.beforeEach((to, from, next) =&gt; { 这一行的from 变为空。

有什么方法可以让用户在用户重新加载/刷新页面后仍然登录?似乎 vue 的“默认”行为是用户不打算重新加载/刷新页面。或者我在这里遗漏了什么?

【问题讨论】:

    标签: vue.js passport.js


    【解决方案1】:

    我的错。在我的app.vue 中,我有下面的代码,不知何故,这是不断将我重定向到重新加载/刷新页面登录的罪魁祸首。删除下面的代码解决了我的问题。

    mounted() {
        if(!this.authenticated) {
            this.$router.replace({ name: "login" })
        }
    },
    methods: {
        setAuthenticated (status) {
            this.authenticated = status
        },
        logout () {
            this.authenticated = false
        }
    }
    

    我想这是我尝试同时遵循几个 vue nodejs 身份验证教程时的问题之一,哈哈

    【讨论】:

      猜你喜欢
      • 2016-05-24
      • 2014-10-04
      • 1970-01-01
      • 1970-01-01
      • 2017-08-10
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多