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 = ;
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 || );
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: '',
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
}
});
}
}
});
});

  

Express+Nodejs 下的登录拦截实现的更多相关文章

  1. nodejs+express中设置登录拦截器

    在nodejs+express中,采用nodejs后端路由控制用户登录后,为了加强前端的安全性控制,阻止用户通过在浏览器地址栏中输入地址访问后台接口,在app.js中需要加入拦截器进行拦截: /*** ...

  2. node express 登录拦截器 request接口请求

    1.拦截器 拦截器可以根据需要 做权限拦截 登录只是权限的一种, 思路是req.session.user判断用户session是否存在,是否是需要拦截的地址, 如果是就跳转登录页,或其他页, 如果非需 ...

  3. nodejs下express+ejs环境搭建

    nodejs下express+ejs环境搭建   分类: Nodejs 1.进入需要创建项目的目录    cd F:\nodeCode     2.创建一个带ejs模板工程,工程名为haha    e ...

  4. vue+axios 前端实现登录拦截(路由拦截、http拦截)

    一.路由拦截 登录拦截逻辑 第一步:路由拦截 首先在定义路由的时候就需要多添加一个自定义字段requireAuth,用于判断该路由的访问是否需要登录.如果用户已经登录,则顺利进入路由, 否则就进入登录 ...

  5. ASP.NET MVC如何做一个简单的非法登录拦截

    摘要:做网站的时候,经常碰到这种问题,一个没登录的用户,却可以通过localhost:23244/Main/Index的方式进入到网站的内部,查看网站的信息.我们知道,这是极不安全的,那么如何对这样的 ...

  6. SpringBoot Web开发(5) 开发页面国际化+登录拦截

    SpringBoot Web开发(5) 开发页面国际化+登录拦截 一.页面国际化 页面国际化目的:根据浏览器语言设置的信息对页面信息进行切换,或者用户点击链接自行对页面语言信息进行切换. **效果演示 ...

  7. 【转】vue+axios 前端实现登录拦截(路由拦截、http拦截)

    一.路由拦截 登录拦截逻辑 第一步:路由拦截 首先在定义路由的时候就需要多添加一个自定义字段requireAuth,用于判断该路由的访问是否需要登录.如果用户已经登录,则顺利进入路由, 否则就进入登录 ...

  8. NodeJS旅程 : express - nodejs MVC 中的王牌

    express 正如ASP.NET MVC 在作为.net平台下最佳的 Mvc框架的地位一样,express在 node.js 环境也有着相同的重要性.在百度上 "nodejs expres ...

  9. 在springMVC中使用自定义注解来进行登录拦截控制

    1:java注解使用是相当频繁,特别是在搭建一些框架时,用到类的反射获取方法和属性,用的尤其多. java中元注解有四个: @Retention     @Target     @Document  ...

随机推荐

  1. Python 6 数字和布尔值及字符串的基本功能

    数据类型:查看变量数据类型type(变量)  或者  print(type(变量)) 整数int:就是不带小数的自然数字,也叫整型.在2.X版本中还分为长整型和整形.但是在3.X版本中统一称为整数或整 ...

  2. java 多线程面试题

    1.什么是线程? 线程是操作系统能够运行的最小调度单位,他被包含在进程中,是进程中实际运作的单位. 2.线程和进程的区别 线程是进程的子集,一个进程有很多线程,每个线程执行不同的任务,不同的进程使用不 ...

  3. printf()参数的处理

    下面程序的输出为? #include <stdio.h> int main(void) { ,b=,c=; printf(),(c = c*)); ; } 答案是110..40..60 这 ...

  4. spring mvc dispatcherservlet处理request流程

    1.dispatcherservlet接收到请求后,doDispatch(request,response) 2.doDispatch()里进行handlermapping,handlermappin ...

  5. AngularJS:日期转换字符

    JS有很多类库提供日期转换函数,AngularJS也不例外.可以通过$filter来完成转换,方法如下: $filter('date')(sourceDate, "yyyy/MM/dd&qu ...

  6. MySQL:解决MySQL无法启动的问题

    MySQL无法启动的原因有多种,这里是我遇到的一种情况和解决方法. 起因: 最近项目需要使用MySQL,于是想在MAC上安装一个本地的数据库,但是其实忘了已经安装过一个版本了,结果发现新的服务器怎么也 ...

  7. c++中cin的基本使用方法

    一.最主要的使用方法cin>> 接收一个数字.字符.字符串.遇"空格"."TAB"."回车"都结束 比如: <span s ...

  8. eclipse添加插件、删除插件 示例: eclipse marketplace

    在有些版本的eclips上并没有eclipse marketplace ,这让eclipse添加插件变得比较玛法,传统的办法都是通过自行下载插件或者用 help->install new sof ...

  9. selenium IDE 回放报错

    解决:Selenium RC未启动,启动即可. java -jar selenium-server-standalone-2.25.0.jar 启动RC报错,提示找不到firefox的path,于是配 ...

  10. 为Chrome开发插件提高工作效率

    工作生活,什么最珍贵,我觉得是时间,怎么节约时间是一个最重要的问题,如果你有重复的工作在网页上,请接着看 上手步骤: 打开https://developer.chrome.com/extensions ...