Express+Nodejs 下的登录拦截实现
利用商城举例,在商城中没有登录之前,可以看商品列表、详情、登录或者注册都可以,但是购买的时候是不行的,那么这个功能在Node后台中是怎么实现的呢,这个功能可以由前端去在前台实现,但是不安全,本文今天讲解,Node 的全局拦截的实现。
在node项目中,打开 app.js ,我们可以看到
// catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); // error handler app.use(function(err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page res.status(err.status || 500); res.render('error'); });
我们可以看到,监听了全局的 404 错误,那么我们可以借鉴这个方法去全局监听 登录这个功能,实现全局的拦截。
在所有的路由前边,添加全局拦截
// 设置全局拦截 app.use((req, res, next) => { if(req.cookies.userId){ // userId 存在,也就是登录了,那就不拦截继续执行 next(); }else{ /** * userId 不存在,也就是没有登录了 * 这个时候 让不登录的接口 能继续调用,其他的一切接口全部禁用,这样就实现了,没有登录什么都调用不了 * req.originalUrl 当前接口地址 * goods 作介绍,查询商品的时候,后边会与很多的参数,第几页多少数据排序等等这个时候,req.originalUrl 就不行了,这个获取不到后边的参数 * 有两种方法 * 1、req.originalUrl.indexOf('/goods') > -1 * 2、获取不带参数的 url 地址 req.path */ // if(req.originalUrl == '/users/login' || req.originalUrl == '/users/loginOut' || req.originalUrl.indexOf('/goods/list') > -1 ){ if(req.originalUrl == '/users/login' || req.originalUrl == '/users/loginOut' || req.path == '/goods/list' ){ next(); }else{ res.json({ status: '101', msg: "当前未登录", result:'' }); } } });
在这里使用的都是后台的 cookie 存储,可以使用后台的 session 。
Node 的登录接口代码
/**
* login
* 以及路由是 users 这里路径就不写 users 了
*/
router.post('/login', function(req, res, next) {
var param = {
userName: req.body.userName,
userPwd: req.body.userPwd
};
// 通过 mongoose 查找修改数据库
User.findOne(param, (err, doc) => {
if(err){
res.json({
status: "1",
msg: err.message
});
}else{
// 接口调用成功
if(doc){
// 保存到 cookie
res.cookie("userId", doc.userId, {
path: '/',
maxAge: 1000*60*60
});
res.cookie("userName", doc.userName, {
path: '/',
maxAge: 1000*60*60
});
// 保存 session,先要安装 express-session插件
// req.session.user = doc;
res.json({
status: "0",
msg: "",
result: {
userName: doc.userName
}
});
}
}
});
});