web应用基于http协议传输,但因为http协议是无状态的,也就是说不具备记忆功能,这意味如果后续处理需要前面的信息,那么需要将前一步的信息重新传输。举个例子,淘宝购物的时候,都是先天订单,再支付,假设这两步分开进行的,那么当你填完订单需要支付时,需要将你的订单信息也再次提交,这样无形中增大了数据传输量,也显得麻烦,正因为如此,所以产生了cookie,每次请求时,都会在头部传递cookie用于传递前一步的信息,再说就多了,打住了,有兴趣的去查阅下http的请求结构 请求行 请求头与请求体,一般简称line header body.
我习惯于将session看做一种特殊的cookie,cookie与session的区别我不多说,了解原理的同学会知道,session也是需要cookie来传递sessionid的,也就是说当客户端禁止掉cookie以后,你的session也会失效.所以我会围绕cookie来介绍.
express框架内置了cookie模块,但如果要使用session,请确保安装了cookie-parser与express-session模块,没有没关系,万能的npm帮你搞定
设置cookie
response.cookie('username','zhangsheng',{expires: new Date(Date.now()+3600000),httpOnly:true, path:'/'}); 参数含义分别是cookie的名字,cookie的值, expires为过期时间,单位毫秒,httpOnly为http专用,https则无效,path是设置的域(/代表全域,关于域的概念请自行百度);
访问cookie
可以直接通过res.cookies来访问
删除cookie
通过内置api res.clearCookie('username'); 第二个参数为可选
如何使用session?首先在app.js中编写如下:
app.use(session({ //混淆的加密串随便填 secret: '12345', //这里的name值得是传递sessionid的cookie的name,默认是:connect.sid name: 'web', //设置maxAge是60000ms,即60s后session和相应的cookie失效过期 cookie: {maxAge: 60 * 1000 }, //是指每次请求都重新设置session cookie,假设你的cookie是10分钟过期,每次请求都会再设置10分钟 resave: true, //是指无论有没有session cookie,每次请求都设置个session cookie ,默认给个标示为 connect.sid saveUninitialized: false })); 设置session的值
req.session.loginstatus = 1 loginstatus为名字
读取session
req.session
删除session
res.clearCookie('web'),有人可能纳闷了,明明要删除的是session,为什么会使用删除cookie的方法呢?再理解一下,session是一种特殊的cookie,我将传递sessionid的cookie删除掉,那么session也会失效,我设置的传递sessionid的cookie名称叫做web 所以我干掉web即可 服务端session时效到后会被自动清除掉
分别编写login.js与article.js router login中代码如下
var express = require('express'); var router = express.Router(); /** * 登陆页面 */ router.get('/',function (request,response,next){ response.render('login/index'); }); /** * 登陆处理 这块可改为数据库查询 */ router.post('/submit',function (request,response,next){ if(typeof request.body.username === 'undefined' || request.body.username === ''){ response.json({code:1,message:"请提交用户名"}); } var username = request.body.username; if(typeof request.body.password === 'undefined' || request.body.username === ''){ response.json({code:1,message:"请提交用密码"}); } var password = request.body.password; if(username != 'zhangsheng' || password !='123456'){ response.json({code:1,message:"用户名或密码错误"}); }else{ request.session.loginstatus = 1; response.cookie('username','zhangsheng',{expires: new Date(Date.now()+3600000),httpOnly:true, path:'/'}); response.redirect('/article'); } response.end(); }); /** * loginout */ router.get('/out',function (request,response,next){ response.clearCookie('username'); }); module.exports = router;index页面非常简单 我使用的是ejs模版 如下
<!DOCTYPE html> <html> <head> <meta http-equiv=“Content-Security-Policy” content=“upgrade-insecure-requests” /> <title>登陆</title> </head> <body> <form action="/login/submit" method="post"> 用户名:<input type="text" name="username" /><br /> 密码:<input type="password" name="password" /><br /> <input type="submit" value="登陆"/> </from> </body> </html>然后是article.js
/** * 文章编辑页面 */ var express = require('express'); var router = express.Router(); router.all('*',function (request,response,next){ console.log(request.session);//这里输出session只为介绍session的访问方法 if(typeof request.cookies.username == 'undefined' || request.cookies.username != 'zhangsheng'){ response.json({message:'非法访问'}); response.end(); } next(); }); /** * 首页 */ router.get('/',function (request,response,next){ response.render('article/index'); }); /** * 提交数据 */ router.post('/submit',function (request,response,next){ }); module.exports = router;运行结果如下 登陆后
控制台输出设置的session信息
浏览器cookie如下
清除掉cookie再次访问 提示请登录! 访问控制完成。
本篇是一个很简单的使用介绍,很多东西可能讲解不到位,还请谅解