node中怎么使用session
cookie 虽然很方便,但是使用 cookie 有一个很大的弊端,cookie 中的所有数据在客户端就可以被修改,数据非常容易被伪造,那么一些重要的数据就不能存放在 cookie 中了,而且如果 cookie 中数据字段太多会影响传输效率。为了解决这些问题,就产生了 session,session 中的数据是保留在服务器端的。
session 的运作通过一个 session_id
来进行。session_id
通常是存放在客户端的 cookie 中,比如在 express 中,默认是 connect.sid
这个字段,当请求到来时,服务端检查 cookie 中保存的 session_id 并通过这个 session_id 与服务器端的 session data 关联起来,进行数据的保存和修改。
这意思就是说,当你浏览一个网页时,服务端随机产生一个 1024 比特长的字符串,然后存在你 cookie 中的 connect.sid
字段中。当你下次访问时,cookie 会带有这个字符串,然后浏览器就知道你是上次访问过的某某某,然后从服务器的存储中取出上次记录在你身上的数据。由于字符串是随机产生的,而且位数足够多,所以也不担心有人能够伪造。伪造成功的概率比坐在家里编程时被邻居家的狗突然闯入并咬死的几率还低。
session 可以存放在
1)内存
2)cookie本身
3)redis 或 memcached 等缓存中
4)数据库中
线上来说,缓存的方案比较常见,存数据库的话,查询效率相比前三者都太低,不推荐;
express 中操作 session 要用到 express-session
(https://github.com/expressjs/session ) 这个模块,主要的方法就是 session(options)
,其中 options 中包含可选参数,主要有:
- name: 设置 cookie 中,保存 session 的字段名称,默认为
connect.sid
。 - store: session 的存储方式,默认存放在内存中,也可以使用 redis,mongodb 等。express 生态中都有相应模块的支持。
- secret: 通过设置的 secret 字符串,来计算 hash 值并放在 cookie 中,使产生的 signedCookie 防篡改。
- cookie: 设置存放 session id 的 cookie 的相关选项,默认为
- (default: { path: '/', httpOnly: true, secure: false, maxAge: null })
- genid: 产生一个新的 session_id 时,所使用的函数, 默认使用
uid2
这个 npm 包。 - rolling: 每个请求都重新设置一个 cookie,默认为 false。
- resave: 即使 session 没有被修改,也保存 session 值,默认为 true。
npm install express-session
npm install cookie-parser
2.引入包
var express=require("express") var app=express() //引用session var session=require("express-session"); var cookieParser=require("cookie-parser")
app.use(cookieParser()) // express中是把session信息存储在内存中 // 配置session app.use(session({ secret:"dsafsafsf", //设置签名秘钥 内容可以任意填写 cookie:{ maxAge:80*1000 }, //设置cookie的过期时间,例:80s后 session和相应的cookie失效过期 resave:true, //强制保存,如果session没有被修改也要重新保存 saveUninitialized:false //如果原先没有session那么久设置,否则不设置 }))
4.设置session里面的内容
app.get("/add",function(req,res){ //往session里存储数据 req.session.name='jack'; //loginok:可以是任意内容,可以为true或false res.send("添加成功") })
5.读取session里面的内容
//读取session app.get("/select",function(req,res){ //查看session console.log(req.session) res.send("查询成功") })
app.get("/del",function(req,res){ req.session.destroy(); res.redirect("http://www.baidu.com"); //删除成功后转到百度页面 res.send("删除成功") })
7.监听端口
app.listen(8080);
node中的session是将值存储在内存中了,不能直接在浏览器中进行查看;
所以将session再写入到cookie中,再浏览器中查看到的就是session存储的时候对应的文件名
注意:session中id是关键词,不能在里面存id,跟session中默认的字段冲突