唠叨几句
web应用基于http协议传输,但因为http协议是无状态的,也就是说不具备记忆功能,这意味如果后续处理需要前面的信息,那么需要将前一步的信息重新传输。举个例子,淘宝购物的时候,都是先天订单,再支付,假设这两步分开进行的,那么当你填完订单需要支付时,需要将你的订单信息也再次提交,这样无形中增大了数据传输量,也显得麻烦,正因为如此,所以产生了cookie,每次请求时,都会在头部传递cookie用于传递前一步的信息,再说就多了,打住了,有兴趣的去查阅下http的请求结构 请求行 请求头与请求体,一般简称line header body.
为什么不说session?
我习惯于将session看做一种特殊的cookie,cookie与session的区别我不多说,了解原理的同学会知道,session也是需要cookie来传递sessionid的,也就是说当客户端禁止掉cookie以后,你的session也会失效.所以我会围绕cookie来介绍.
express的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再次访问 提示请登录! 访问控制完成。
本篇是一个很简单的使用介绍,很多东西可能讲解不到位,还请谅解