之前用express框架搭建一个后台管理应用,主要是学习node如何编写接口。今天带大家学习node如何实现过滤器,以及用户信息状态如何存储。
先来了解中间件:cookie-parser模块与express-session模块。
cookie-parser模块:这个是为了方便操作客户端中的cookie值,区别于session。
npm i cookie-parser --save
app.js文件
引入中间件
var cookieParser = require('cookie-parser')
使用中间件
app.use(cookieParser('123456'));
设置cookie
res.cookies('key','value',option);具体的option配置可查看其它博文
是否传参数的影响:
1、在使用中间的时候是否传参其实就是是否加密,那么传参之后的加密效果如下图。
2、在设置cookie值时,如果将属性signed设置为true时,则必须传参。
在后端种好cookie之后,浏览器会出现如下图片:
express-session模块:session 是另一种记录客户状态的机制, 不同的是 Cookie 保存在客户端浏览器中, 而 session 保存在服务器上。
引入express-session
npm i express-session --save
app.js文件
var session = require("express-session");
app.use(session({
secret: '123456',
resave: false,
saveUninitialized: true
}));
以上代码就将两个中间件引入当自己的项目当中了,那如何使用,并且在哪里使用。如下例子可以说明:
注册接口:将用户输入的信息存到数据库当中。
var express = require('express');
const request = require('request');
const queryString=require('query-string');
var router = express.Router();
var db=require('../sql/db.js');
router.get('/',(req,res,next)=>{
let username,password;
if(Object.keys(req.query).length===2){
username=req.query.name;
password=req.query.password;
db({database:'hhl'},"INSERT INTO user(username,password) VALUES ('"+username+"','"+password+"')",function(result,fields){
res.send('注册成功!!')
})
}
})
module.exports=router;
登入接口代码:在这个接口当中,查询数据库,并且将查询的结果种到cookie当中,存在session中,那么下次想获取用户信息则直接在session中获取。
login.js
var express = require('express');
var router = express.Router();
var db=require('../sql/db.js');
router.get('/', function(req, res, next) {
let name,password;
if(Object.keys(req.query).length==2){
name=req.query.name; //用户名
password=req.query.password; //用户密码
db({database:'hhl'},"SELECT username,password FROM user WHERE username='"+name+"' AND password='"+password+"'",function(result,fields){
if(!result.length){
res.send('登入失败!!');
}else{
req.session.auth_username=name;
req.session.auth_password=password;
res.cookie('username',name, {maxAge:1000 * 60 * 60 * 24 * 7,signed:true}); //设置cookie的保存时间,7天为例
res.cookie('password',password, {maxAge: 1000 * 60 * 60 * 24 * 7,signed:true}); //console.log(req.signedCookies);
res.send('登入成功!!');
}
})
}
});
module.exports = router;
设置完成之后的cookie值如图片
注销接口:
将session,cookie的值都删除。
var express = require('express');
const queryString=require('query-string');
var router = express.Router();
var db=require('../sql/db.js');
router.get('/',(req,res,next)=>{
let user=req.session.auth_username;
let pass=req.session.auth_password
res.cookie('username',user, {maxAge:0,signed:true});
res.cookie('password',pass, {maxAge:0,signed:true});
req.session.auth_password=undefined;
req.session.auth_username=undefined;
let {username,password}=req.signedCookies;
console.log(req.session.auth_username && req.session.auth_password,username,password)
res.send('注销成功!!');
})
module.exports=router;
获取图片接口:(这个接口就是用来做测试的)
var express = require('express');
var router = express.Router();
var path = require('path');
var multiparty = require('multiparty');
router.get('/',(req,res,next)=>{
res.send({
status:"200",
msg:"成功!",
img:'http://localhost:3000/images/home1.png'
});
})
那么重点关注对象----过滤器怎么实现。代码如下
session关闭浏览器这信息就没了,如果使用cookie来实现信息的有效保存。
实现思路:
1、判断是否存在session
是 next
否 判断是否有cookie
是 将cookie值取出来赋值给session 并且next
否 获取请求地址,白名单login,relogin接口 next
app.use(function(req,res,next){
if(!(req.session.auth_username && req.session.auth_password)){
console.log('无session');
if(req.signedCookies.username && req.signedCookies.password){
console.log('有cookie')
let {username,password}=req.signedCookies;
req.session.auth_username=username;
req.session.auth_password=password; //将cookie的值存在session里
next();
}else{
let arr=req.url.split('/');
console.log('无cookie',arr);
let index=arr && arr.findIndex((item)=>{
return (item.indexOf('login')!=-1 || item.indexOf('relogin')!=-1);
});
if(index!==-1){
next();
}else{
return res.status(401).json({
msg: '没有登入,请先登入'
})
}
}
}else{
console.log('有session',req.session.auth_username && req.session.auth_password);
next();
}
})
代码思路检验:
1、还没登入点注销出现如下图:说明被拦截
2、点击登入的图片:
3、点击登入之后,获取图片:
4、点击注销:
5、最后再获取图片一下:
过滤器以及登入注销的实现就完成啦~~来总结一下:
坑1:过滤器一定要放在路由导向之前。
坑2:sql拼接一定要心细心细再心细。
优化建议:
如上的代码就是将具体功能实现了而已,并不完美。可以将过滤再起一个文件夹,因为项目当中可以用的的过滤器,拦截器不止一个。最后在app.js引入就行,这样看的舒服。再者,每个接口的都需要优化,比如注册接口的用户账户判重,密码强弱设置,以及友好的用户提示等等之类的功能。