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…