天天看點

哈希加密bcrypt 和 cookie和session 和 joi 和 formidable 和 FileReader

哈希加密bcrypt和cookie和session和joi 和``formidable``FileReader

1.哈希加密bcrypt

1.密碼加密

哈希加密是單程加密方式:

1234=>abcd

;

在加密密碼中加入随機字元串可以增加密碼被破解的難度;

//導入bcrypt子產品
const bcrypt = require('bcrypt');
//生成随機字元串  gen=>generate 生成salt 鹽
// genSalt方法接收一個數值作為參數
// 數值越大 生成的随機字元串複雜度越高
// 數值越小 生成的随機字元串複雜度越低
// 預設值是 10
// 傳回生成的随機字元串
let salt = await bcrypt.genSalt(10);
//使随機字元串對密碼進行加密
// 1. 要進行加密的明文
// 2. 随機字元串
// 傳回值是加密後的密碼
let pass = await bcrypt.hash('明文密碼',salt);
           

bcrypt 依賴的其他環境

  1. python 2.x
  2. node-gyp npm install -g node-gyp
  3. windows-build-tools
  4. npm install --global --production windows-build-tools

2.密碼對比

// 密碼比對
let result = await bcrypt.compare('明文密碼', '加密密碼');
           

2.cookie和session

cookie:浏覽器在電腦硬碟中開辟一塊空間,主要供伺服器端存儲資料;

1.cookie中的資料是以域名的形式進行差別的;

2.cookie中的資料是有過期時間的,超過時間資料會被浏覽器自動删除;

3.cookie中的資料會随着請求被自動發送到伺服器端;

哈希加密bcrypt 和 cookie和session 和 joi 和 formidable 和 FileReader

session:實際上就是一個對象,存儲在伺服器的記憶體中,在session對象中也可以存儲多條資料,每一條資料都有一個sessionid作為唯一辨別;

哈希加密bcrypt 和 cookie和session 和 joi 和 formidable 和 FileReader

在node中使用express-session 子產品中實作session功能

// 導入express-session子產品
const session = require('express-session');
// 配置session
app.use(session({
    secret: 'secret key',
    resave:false,
    saveUninitialized: false,
    cookie:{
        //maxAge接收一個毫秒,從目前時間起,加上設定的時間,如果超過設定的時間,就删除
        maxAge:24*60*60*1000
    }
}))
           

從使用者頁面從session中擷取資料

// 建立使用者清單路由
admin.get('/user',(req,res)=>{
  res.render('admin/user',{
      //在渲染頁面中使用模闆拼接使用者名,在頁面中顯示
    msg:req.session.username
  })
})
           
//将使用者名存儲在請求對象中
//通過請求對象req下邊的session對象存儲,是express-session子產品添加的方法
//這樣就可以向session對象裡邊存儲一些資料,在内部自動生成一個唯一的sessionid,并且把sessionis存儲到用戶端的cookie中
 req.session.username = user.username;
           

3.joi (javaScript對象的規則描述語言和驗證器)

安裝第三方包 npm install joi

//引入joi子產品
const joi = require('joi');
//定義對象的驗證規則
const schema = {
    username:joi.string().min(2).max(5).required().error(new Error('username屬性沒有通過驗證')),
    birth:joi.number().min(1900).max(2020).error(new Error('birth沒有通過驗證'))
};
async function run(){
    try {
        //驗證
        await joi.validate({username:'ab',birth:1901},schema);
    }
    catch(ex){
        console.log(ex.message);
        return;
    }
    console.log('驗證通過');
}
run();
           

4.

formidable

作用:解析表單,post請求,檔案上傳;

安裝 npm i formidable

//1.建立表單解析對象
    const form = new formidable.IncomingForm();
    //2.配置上傳檔案的存放路徑  使用絕對路徑
    form.uploadDir = path.join(__dirname,'../','../','public','uploads');
    //上傳的檔案要保留字尾
    form.keepExtensions = true;
    //4.解析表單
    form.parse(req,async(err,fields,files)=>{
	 //1.err是錯誤對象,如果表單解析失敗,err裡邊存儲的是錯誤資訊,如果表單解析成功,err将會是null
        //2.fields對象類型,儲存表單資料相當于border-parser 解析post請求資料
        // 3.files 對象類型  儲存了和上傳檔案相關的資料
        //使用的時候可以列印出來
    })
           

5.

FileReader

前端上傳檔案資料控件

//擷取檔案元素
var file = document.querySelector('#file');
//擷取img元素
var preview = document.querySelector('#preview');
        file.onchange = function(){
            // 1.建立檔案讀取對象
            var reader = new FileReader();
            // 使用者選擇的檔案清單 很多檔案
            // console.log(this.files[0]);

            //2.讀取檔案  異步函數,暫時不能拿到傳回值
            reader.readAsDataURL(this.files[0]);
            // 3.監聽onlod事件  在檔案讀取對象下邊
            reader.onload = function(){
                //擷取讀檔案的結果  reader.result
                // console.log(reader.result);
                //将讀取檔案的結果顯示在頁面中
                preview.src = reader.result;
            }
        }
           

6.資料分頁

//導入分頁子產品
const pagination = require('mongoose-sex-page');
// 從資料庫中查詢資料
	let result = await pagination(Article).page(page).size(4).display(5).find().populate('author').exec();
           

繼續閱讀