Node之存儲

localStorage(本地存儲)

  • 特點
    • 1.是H5提供的不兼容低版本瀏覽器
    • 2.存儲內容大小爲5MB
    • 3.不受安全衛士,瀏覽器等清除的影響
    • 4.永久存儲到本地,不手動刪除會一直存在,關掉瀏覽器也會存在
    • 5.嚴格的本地存儲,與服務器無關
    • 6.存儲獲取的結果是字符串
  • localStorage的使用

    • 設置

        localStorage.setItem([key],[value])
    • 獲取

        localStorage.getItem([key])
    • 移除

        localStorage.removeItem([key])
    • 通過索引獲取指定位置存儲信息對應的key

        localStorage.key([key])
    • 清空本源下的所有存儲信息

        localStorage.clear()

sessionStorage(臨時存儲)

  • 與localStorage用法一致的會話存儲,頁面刷新會話還可以保存,一旦頁面關閉,信息就清空了

cookie(本地存儲)

  • 特點
    • 1.兼容所有瀏覽器
    • 2.存放的內容少,4kb,瀏覽器會限制一個站點最多可以存放20個cookie
    • 3.不安全,重要信息最好不要存放在cookie上(md5加密)
    • 4.cookie容易被安全衛士等軟件清除
    • 5.有過期時間
    • 6.不是嚴格的本地存儲,獲取cookie時,保證服務器和客戶端保持連接,讀取cookie也要經過HTTP處理
  • cookie的應用
   let http=require('http');
   let url=require('url');
   let querystring=require('querystring')
   http.createServer(function(req,res){
       let {pathname}=url.parse(req.url,true);
       res.setHeader('Content-type','text/html;charset=utf-8')
       //當客戶端訪問的路徑是/write的話就表示寫cookie
      if (pathname=='/visit'){
            let cookie=req.headers.cookie;
            let visit=1;
            if (cookie){
                 //cookie並不是真正的查詢字符串,所以不同字段的風格符是; ,而不是&,所以在解析的時候要注意傳入字段分隔符
                 let cookieObj=querystring.parse(cookie,'; ')
                if(cookieObj.visit){
                     // + 字符串轉數字的意思
                     visit=(isNaN(+cookieObj.visit)?0:parseInt(+cookieObj.visit))+1
                 }
              }
             res.setHeader('Set-Cookie',`visit=${visit}`)
             res.end(`顧客歡迎你第${visit}次來`)
    }else{
             res.end('404')
    }
}).listen(8081);


  • queryString擴展

原理:利用&把字段分開,再用等號把鍵和值分開
參數:參數1-》要分隔的內容 參數2:以什麼進行分割
有兩個方法:querystring.parse() querysting.stringfy()

 let str='id=1&age=3';
 let querystring=require('querystring')
 let obj=querystring.parse(str,'&’)//&是默認的分隔符
  • md5加密

    • 特點
      • (1)任意長度的輸入,會產生出相同長度的輸出
      • (2)不同的輸入一定要輸出不同的輸出
      • (3)不能從輸出內容反推輸入的值
    • 加密方式
      • 依賴於內置模塊 crypto
      createHash 指定算法 update要加密的字符串  digest以16進制的格式輸出摘要的結果
        let crypto=require('crypto')
        let str='hello'
        let res=crypto.createHash('md5').update(str).digest('hex')
        //每次加密之後更新的值都不一樣,因此在使用過程中,要每次都獲取新的值

session(服務器存儲)

  • 存放在服務器上
  • session的操作
    • 寫 req.session.username=’wang’
    • 讀 req.session.error
    • 刪除 delete req.session error
  • 使用session的參數

        app.use(session({
            resave:true,//每次客戶端來請求的時候,都要重新保存篩選
             saveUninitialized:true,//保存未使用過的session
             secret:'wang' //密匙,用來加密session
        }))
  • 完整demo

    權限管理系統 註冊get/post,登錄get/post,歡迎頁面get /reg
    1.先通過get訪問註冊頁面,返回空白的註冊表單 /user
    2.填寫此註冊表單,如果註冊成功跳到登錄頁,如果註冊失敗返回註冊表單 /login
    3.填寫登錄表單,發送post登錄請求,如果登錄成功,跳到用戶主頁,如果登錄失敗,調回錄頁

    
        let express = require('express');
        let path = require('path');
        let bodyParser = require('body-parser');
        let session = require('express-session');
        let crypto = require('crypto');
        let app = express();
        app.use(session({
          resave:true,
          saveUninitialized:true,
          secret:'zfpx'
        }));
        //此中間件是專門用來處理請求體的,會把查詢字符串格式的請求體轉成一個對象並賦給req.body
        //把查詢字符串變成對象 querystring.parse() qs.parse();
        app.use(bodyParser.urlencoded({extended:false}));
        //設置模板引擎
        app.set('view engine','html');
        //設置模板存放的根目錄
        app.set('views',path.resolve('views'));
        //如果模板是html的話,用ejs來進行渲染
        app.engine('html',require('ejs').__express);
        let users = [];
        app.listen(8080);
        //當客戶端通過GET方式訪問/reg的時候,服務器返回一個空白的註冊表單
        app.get('/reg',function(req,res){
          //把cookie中的error屬性取出
          let error = req.session.error||'';
          //清除cookie中的error
          //res.clearCookie('error');
          delete req.session.error;
          res.render('reg',{title:'用戶註冊',error});
        });
        app.post('/reg',function(req,res){
           let user = req.body;
           //找一下用戶數組中有沒有跟當前傳過來的用戶用戶名相同的用戶
           let oldUser = users.find(item=>item.username == user.username);
           if(oldUser){//如果找到了同名用戶,則重定向到註冊頁
             //back是一個關鍵字,表示上一個頁面,從哪來回滾哪裏去
             //向客戶端寫入cookie
             //res.cookie('error','此用戶名已經被佔用,請換一個試試');
             req.session.error = '此用戶名已經被佔用,請換一個試試';
             res.redirect('back');//讓客戶端重新向另外一個路徑發起請求
           }else{//如果沒有找到同名的用戶,則重定向到登錄頁
             //先對密碼進行md5加密後才保存
             user.password = crypto.createHash('md5').update(user.password).digest('hex');
             users.push(user);
             res.redirect('/login');
           }
        });
        //當客戶端通過GET方式訪問/login的時候,返回登錄表單
        app.get('/login',function(req,res){
          let error = req.session.error||'';
          delete req.session.error;
          res.render('login',{title:'用戶登錄',error});
        });
        //當客戶端提交登錄表單之後
        app.post('/login',function(req,res){
         let user = req.body;//{username,password}
          //查找一下看看用戶數組中有沒有符合條件的用戶
         let oldUser = users.find(item=>item.username==user.username && item.password == crypto.createHash('md5').update(user.password).digest('hex'));
         if(oldUser){//如果找到了說了登錄是成功的
           req.session.success = '登錄成功';
           req.session.username = oldUser.username;
           res.redirect('/user');
         }else{//如果沒有找到,說明登錄是失敗的
           req.session.error = '用戶名或密碼輸入錯誤';
           res.redirect('back');
         }
        });
        //用戶主頁
        app.get('/user',function(req,res){
         let success = req.session.success||'';
         let error = req.session.error||'';
         let username = req.session.username||'';
         delete req.session.success;
         delete req.session.error;
         res.render('user',{title:'用戶主頁',success,error,username});
        });
        建一個views文件夾,裏邊有login.html,reg.html,user.html文件,文件中要設置<title><%=title%></title> <p style="color:red"><%=error%></p>等,凡是通過此js文件展示在對應html頁面的內容,都應該在html中加入模板
  • 服務器存儲的技術方案
    • 1.session
    • 2.文件存儲
    • 3.數據庫存儲
      • mongodb(NODE) 輕量級
      • Access微軟辦公自帶
      • My SQL更輕量級
      • SQL SERVER 容量較大的存儲
      • ORACLE 容量更大的存儲
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章