tooken原理分析(登录和退出中)

1,324 阅读2分钟

下图是分析token的工作过程: image.png

先实现登录验证和token值的存储

那仿的一个电商管理平台的代码来举例: 项目用到了vue、vue-cli、axios、element-ui 在表单的登陆区域如下所示,因为配置了:rule的验证规则,所以点击登录之后,要对输入的数据进行预验证。

<el-form ref="loginRef" :model="loginForm" :rules="loginRules" label-width="0px"
         class="login-form">
             <!-- 用户名 -->
            <el-form-item prop="username">
                <el-input v-model="loginForm.username" prefix-icon="iconfont icon-user"></el-input>
            </el-form-item>
            <!-- 密码 -->
             <el-form-item prop="password">
                <el-input v-model="loginForm.password" type="password"
                prefix-icon="iconfont icon-lock_fill">
                </el-input>
            </el-form-item>
            <el-form-item class="btn">
                <el-button type="primary" @click="login">登录</el-button>
                <el-button type="info" @click="reset">重置</el-button>
            </el-form-item>
         </el-form>

因为对表单数据进行预验证,所以要拿到表单数据,如下通过$refs拿到对应的表单,然后通过validate进行预验证,参数是一个回调函数;回调函数能够拿到预验证的结果valid,valid是个布尔值,true是预验证成功,false是预验证失败。 如果预验证失败就返回,如果预验证成功就发送axios请求,请求数据。

 login() {
      this.$refs.loginRef.validate(async (valid) => {
        if (!valid) return;
        const { data: res } = await this.$http.post('login', this.loginForm);
        // console.log(res);
        // 设置提示信息,弹窗提示是成功还是失败
        if (res.meta.status !== 200) this.$message.error('登录失败!');
        else { this.$message.success('登录成功'); }
        // 1、将成功之后的token,保存到客户端sessionStorage中
        //  1、1 项目中除了登录之外的其他API,必须在登陆之后才能够访问
        //  1、2 token 只能在当前网页打开期间生效,所以将token保存在sessionStorage中
        window.sessionStorage.setItem('token', res.data.token);
        // 2、通过编程式导航跳转到后台主页,路由地址是/home
        this.$router.push('/home'); 
      });
    }

请求数据的过程就是上面图中的过程,将数据发送给服务器进行登录验证,服务器返回的数据里面包含一个token值,客户端需要将这个token值给存储起来。这就涉及到了客户端将可以将数据存储在哪?cookie、sessionstorage、localstorage。

在这里选择存储在sessionstorage,因为sessionstorage的存储时间是有时间限制的,当会话结束的时候,存储会被清空。页面会话在浏览器打开期间一直保持,并且重新加载或者恢复页面时仍会保持原来的页面会话。

通过sessionStorage.setItem()将token值存储起来。

这样在SPA页面中,只有有token值才能从登录页面跳转到其他页面,可以通过前置路由守卫来实现,如果有token值就放行,没有token值就跳转(to)到登录页面重新登录。

以上便实现了1、发送登录请求;2、服务器验证并返回token值;3、客户端存储token值(存到sessionstorage中)

发送请求时携带token值,让服务器进行验证

axios.defaults.baseURL = 'http://127.0.0.1:8888/api/private/v1/';
 // 在挂载到原型对象之前给他设置一个拦截器
axios.interceptors.request.use(config=>{
  // console.log(config)
  config.headers.Authorization = window.sessionStorage.getItem('token');
  return config
})
Vue.prototype.$http = axios;

在配置axios的时候,给他加一个请求拦截器,在发送请求之前给请求头中的authorization项添加token(从sessionstorage里面获取),这样请求中就携带token值了。