基於vue 做了關於token驗證的例項,和移動端下fixed失效的解決方案

_Construct發表於2018-08-07

vue-koa2-token

基於vue的 做了token驗證

前端部分(對axios設定Authorization)

import axios from `axios`
import store from `../store`
import router from `../router`
 
//設定全域性axios預設值
axios.defaults.timeout = 6000; //6000的超時驗證
axios.defaults.headers.post[`Content-Type`] = `application/json;charset=UTF-8`;
 
//建立一個axios例項
const instance = axios.create();
instance.defaults.headers.post[`Content-Type`] = `application/json;charset=UTF-8`;
 
axios.interceptors.request.use = instance.interceptors.request.use;
 
//request攔截器
instance.interceptors.request.use(
    config => {
        //每次傳送請求之前檢測都vuex存有token,那麼都要放在請求頭髮送給伺服器
        if(store.state.token){
            config.headers.Authorization = `token ${store.state.token}`;
        }
        return config;
    },
    err => {
        return Promise.reject(err);
    }
);
//respone攔截器
instance.interceptors.response.use(
    response => {
        return response;
    },
    error => { //預設除了2XX之外的都是錯誤的,就會走這裡
        if(error.response){
            switch(error.response.status){
                case 401:
                    store.dispatch(`UserLogout`); //可能是token過期,清除它
                    router.replace({ //跳轉到登入頁面
                        path: `login`,
                        query: { redirect: router.currentRoute.fullPath } // 將跳轉的路由path作為引數,登入成功後跳轉到該路由
                    });
            }
        }
        return Promise.reject(error.response);
    }
);
 
export default instance;
 然後在路由檔案中
 //註冊全域性鉤子用來攔截導航
router.beforeEach((to, from, next) => {
  //獲取store裡面的token
  let token = store.state.token;
  //判斷要去的路由有沒有requiresAuth
  if(to.meta.requiresAuth){
 
    if(token){
      next();
    }else{
      next({
        path: `/login`,
        query: { redirect: to.fullPath }  // 將剛剛要去的路由path(卻無許可權)作為引數,方便登入成功後直接跳轉到該路由
      });
    }
 
  }else{
    next();//如果無需token,那麼隨它去吧
  }
});

後端(node) 我們封裝了一箇中介軟體 在需要驗證token的路由,加上這個中介軟體

 
 router.get(`/dosh`,checkToken,User.dosh)
 
const jwt = require(`jsonwebtoken`);
 
1、使用jsonwebtoken 建立token
const jwt = require(`jsonwebtoken`);
 
//登入時:核對使用者名稱和密碼成功後,應用將使用者的id(圖中的user_id)作為JWT Payload的一個屬性
module.exports = function(user_id){
    const token = jwt.sign({
        user_id: user_id
    }, `sinner77`, {
        expiresIn: `3600s` //過期時間設定為60妙。那麼decode這個token的時候得到的過期時間為 : 建立token的時間 + 設定的值
    });
    return token;
};
2、對於前端的請求,校驗介面
//檢查token是否過期
module.exports = async ( ctx, next ) => {
    if(ctx.request.header[`authorization`]){
        let token = ctx.request.header[`authorization`].split(` `)[1];
        //解碼token
        let decoded = jwt.decode(token, `sinner77`);
        //console.log(decoded);的輸出 :{ user_id: `123123123`, iat: 1494405235, exp: 1494405235 }
        if(token && decoded.exp <= new Date()/1000){
            ctx.status = 401;
            ctx.body = {
                message: `token過期`
            };
        }else{
            //如果許可權沒問題,那麼交個下一個控制器處理
            return next();
        }
    }else{
        ctx.status = 401;
        ctx.body = {
            message: `沒有token`
        }
    }
};

移動端開發過程中,相信很多人對於定位fixed都會遇到很多問題而頭疼,底部fixed輸入框被彈起,左邊slide有輸入框,fixed定位失效
,還有動態新增fixed定位,會有卡頓現象。所以,移動端下開發,儘量少用fixed佈局。

以前左邊是fixed 獲取焦點時,手機鍵盤會把fix失效
下面介紹解決這種現象方法
1、佈局
大概的佈局如下

 <html>
    <head></head>
    <body>
          <div>需要定位的內容</div>
         <div class=".body">
                  這裡是主體內容
        </div>
        <div>需要定位的內容</div>
   </body>

</html>
//主要的樣式如下,其他需要定位的內容可以放到.body div外面

 html {
 height: 100%;
  }

body {

width: 100%;
height: 100%;
position: relative;
overflow: hidden;

}
.body{

  width: 100%;
height: 100%;
position: absolute;
left: 0;
top: 0;
z-index: 0;
box-sizing: border-box;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
overflow-x: hidden;
overflow-y: scroll;
-webkit-overflow-scrolling: touch;

}
2.isscroll 的使用
這個滾動外掛,官網有詳細介紹

原文地址:blog
程式碼託管github 歡迎star
https://github.com/yxl720/vue…

相關文章