Element-ui中Token的使用---Vue实现完整的系统登录退出功能

一、技术提要

  • 涉及element-ui中的validate方法
    在这里插入图片描述

二、具体实现

1、表单部分代码

	<el-form ref="loginFormRef" :model="loginForm" :rules="loginFormRules" label-width="0px" class="login_form">
        <!-- 用户名 -->
        <el-form-item prop="username">
          	<el-input v-model="loginForm.username" ></el-input>
        </el-form-item>
        <!-- 密码 -->
        <el-form-item prop="password">
          	<el-input v-model="loginForm.password"  type="password"></el-input>
        </el-form-item>
        <!-- 按钮区域 -->
        <el-form-item class="btns">
          	<el-button type="primary" @click="login">登录</el-button>
          	<el-button type="info" @click="resetLoginForm">重置</el-button>
        </el-form-item>
	</el-form>

2、JavaScript代码

说明:

  • script内使用this.$refs.loginFormRef获取到表单引用对象(注意:表单中el-form组件需要有ref=“loginFormRef”)
  • window.sessionStorage.setItem(‘token’, res.data.token)可将token存储到客户端的 sessionStorage 中, res.data.token为存储的值。
<script>
export default {
  data() {
    return {
      // 登录表单的数据绑定对象loginForm
      loginForm: {
        username: 'root',
        password: '123456'
      },
      // loginFormRules为element-ui表单验证规则
      loginFormRules: {
        // 验证用户名是否合法
        username: [
          { required: true, message: '请输入登录名称', trigger: 'blur' },
          { min: 3, max: 10, message: '长度在 3 到 10 个字符', trigger: 'blur' }
        ],
        // 验证密码是否合法
        password: [
          { required: true, message: '请输入登录密码', trigger: 'blur' },
          { min: 6, max: 15, message: '长度在 6 到 15 个字符', trigger: 'blur' }
        ]
      }
    }
  },
  methods: {
    // 表单重置方法
    resetLoginForm() {
      //重置表单
      this.$refs.loginFormRef.resetFields()
    },
    
    //验证登陆信息并存储Token至本地---------核心代码开始
    login() {
      //this.$refs.loginFormRef绑定表单对象并使用validate方法
      this.$refs.loginFormRef.validate(async valid => {
        
        //valid判断表单验证是否通过,未通过则直接返回不向服务器请求数据
        if (!valid) return
        
        //此处涉及ES6解构赋值,也可使用res直接接收await返回数据再对数据进行处理
        const { data: res } = await this.$http.post('login', this.loginForm)
        
        //判断状态码若状态码不存在弹出提示失败信息,状态码为200则提示登陆成功
        if (res.meta.status !== 200) return this.$message.error('登录失败!')
        this.$message.success('登录成功')
        
        // 登录成功之后将token保存到客户端的 sessionStorage 中,项目中除了登录之外的其他API接口,必须在登录之后才能访问
        window.sessionStorage.setItem('token', res.data.token)
        
        // 登录成功后使用vue Router的编程式路由将页面跳转到首页
        this.$router.push('/home')
      })
    }
  }
}
</script>

3、使用VueRouter限制页面访问

  • 使用路由守卫阻止未登录用户访问登陆页面以外的页面
router.beforeEach((to, from, next) => {
	  //如果前往登陆页面放行
	  if (to.path === '/login') return next()
	  
	  //读取客户端sessionStorage 中存储的Token
	  const tokenStr = window.sessionStorage.getItem('token')
	  
	  //判断Token是否存在,存在则放行,不存在则需进行登录
	  if (!tokenStr) return next('/login')
	  next()
})

4、使用axios拦截器功能—书写在入口文件main.js中

  • 使用axios拦截器设置每次请求所携带的请求头(除登录之外的其他API接口,必须在携带与后端约定的请求头)
  • 需要授权的 API ,必须在请求头中使用 Authorization 字段提供 token 令牌(此处与后端开发人员进行约定)
axios.interceptors.request.use(config => {
   //此处读取上文存储的token并设置请求头
  config.headers.Authorization = window.sessionStorage.getItem('token')
  // 这里需要注意,必须return config才能生效
  return config
})

5、退出功能

  • 在退出按钮上绑定logout() 事件,清空本地存储的token并将路由重定向至登录页面。
logout() {
      window.sessionStorage.clear()
      this.$router.push('/login')
    }

至此一个完整的系统登录退出功能以完成!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值