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 容量更大的存儲