1. 配置中間件(有坑請注意)
1、在 app/middleware
下編寫中間件。
2、配置中間件
坑!!!:請注意一般情況下,我們會在
router.js
中,開啓中間件,這麼做一般情況下沒事兒,但是爲了存儲訪問者ip,我們需要在中間件中插入一條數據,此時我們就用到了module.exports = (optinos,app) =>{}
中的app
。加入我們在router
中使用中間件會導致app
不存在。故需要在config.default.js
中配置。
config.middleware = [ '中間件名稱' ];
config.中間件名稱= {
enable: true, // 是否開啓
match: [ '/blog' ], // 作用於的路由
};
2. 實現
實現的功能:
- 存儲session,ip,訪問時間等數據。
- 已存在session則更新其數據
- 一天之內只算訪問一次的量
'use strict';
module.exports = (options, app) => {
return async function blogauth(ctx, next) {
// 直接執行下一步
next();
const new_ip = ctx.request.ip; // 獲取ip
if (new_ip === '120.27.20.14') return false; // 判斷是“自己”服務器ip就過濾掉
const date = Date.parse(new Date()) / 1000; // 獲取當期時間/1000(爲了字段是int(11))
const session_blog = ctx.session.SESSION_BLOG; // 獲取客戶端時候有session(沒有則爲undefined)
const visitor = await app.mysql.get('visit', { session: session_blog }); // 查詢詞session表中已經存在
if (!session_blog || !visitor) { // 沒有session 或者 表中不存在session用戶,則插入一條新的數據
const visit_session = 'blog_' + date; // 產生新的session
ctx.session.SESSION_BLOG = visit_session;
app.mysql.insert('visit', { session: visit_session, ip: new_ip, visit_time: date, visit_last_time: date });// 插入數據
} else { // 存在session則更新此seeison用戶的數據
let { ip, times, id, visit_last_time } = visitor;
if ((visit_last_time - date) < (60 * 24)) return false; // 一天之內 不在記錄訪問次數
if (ip.indexOf(new_ip)) ip += (',' + new_ip); // 同一session不用ip記錄
app.mysql.update('visit', { id, ip, times: times += 1, visit_last_time: date }); // 更新數據
}
};
};