Node之存储
来源:互联网 发布:js 上传图片控件 编辑:程序博客网 时间:2024/06/06 02:47
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 容量更大的存储
阅读全文
0 0
- Node之存储
- Node.js session 用mongodb存储之 socket.io访问session的值
- Sand学习之--Node
- TCPMP之node
- Node.js之console
- Node.js之Modules
- cocos2dx之node坐标
- DOM之Node
- Node【模块】之path
- node.js之util
- node.js之文件系统
- node初探之问题
- elasticsearch之node模块
- Node.js之Mysql
- HDFS之Node角色
- Node之锚点
- Node之tags
- 读书笔记之-node入门
- 用php调用接口API
- C语言编译预处理技术一本道来
- rabbitmq的vhost与用户管理
- java_泛型
- nova service-list 显示 zone 问题
- Node之存储
- 1040. 有几个PAT(25)
- decrypt.guarantee@aol.com].block 结尾新勒索病毒解析
- Hadoop2源码分析-MapReduce篇
- mysql explain sql性能分析概述
- RFC5766-TURN协议
- Head First Python(第五章)
- 20171204日记账流水(复盘)
- java-基本数据类型