Express + Node.js实现登录拦截器的实例代码


Posted in Javascript onJuly 01, 2017

介绍

这边的拦截器,对应于spring MVC中的filter,所有的http请求,通过拦截器处理之后才能访问到对应的代码/资源。

最典型的应用场景就是实现访问权限控制,给予不同的用户/用户组不同的页面和接口访问权限,仅能够访问允许的页面和接口。

场景

app.post('/login', function(request, res, next){
// do something
});
app.post('/getData',function(request, res, next){
// do something
  var data="some data";
  res.send({"data":data});
});

如果不做任何处理,任何人发送getData的post请求可以直接从后台读取数据,而不需要任何的登陆,只需要知道接口就可以。

对应每个接口,如果在每个接口下面加上权限判断,代码会非常的重复,于是面向切面就来了,可以通过把拦截器加在每个http请求之前,来实现权限判断的功能。

实现

// 所有用户可以访问index.html, error.html
// admin可以访问admin.html, /getData
// 登陆用户可以访问home.html
app.all('/*', function(request, res, next){
  // 思路:
  // 得到请求的url
  // 然后得到request的cookie,根据cookie得到当前登陆的用户
  // 判断用户对应url的权限
  var jsPattern=/\.js$/;
  var url=request.orignalUrl;
  if(jsPattern.test(url)){
  // 公共部分,放行
    next();
    return;
  }
  if(url=='index.html'||url=='error.html'){
    next();
    return;
  }
  var cookie=JSON.stringify(req.cookies);
  if(access){
    next();
  }
  else{
    res.redirect('error.html');
  }
});

实现思路:

1. 拦截所有请求(上面的就可以啦),得到当前访问的url

2. 根据cookie得到当前用户

3. 根据url和用户对应的身份来判断是否可以访问

4. 如果可以调用next();

5. 如果不能访问,返回错误信息

注意

  1. next(); 仅仅是一个函数,对应着原本处理请求的代码,如前面的app.post(‘/getData'),当这里的代码处理完成后会回到对应next(); 处,所以需要处理好对应的关系,如果必要需要return结束当前的函数,不然会出错哒。
  2. 对于公共的部分,如js插件,部分图片,还有css的部分,可以直接放行。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript miscellanea -display data real time, using window.status
Jan 09 Javascript
一个用javascript写的select支持上下键、首字母筛选以及回车取值的功能
Sep 09 Javascript
js获取form的方法
May 06 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
May 11 Javascript
浅析BootStrap栅格系统
Jun 07 Javascript
js获取form表单所有数据的简单方法
Aug 18 Javascript
JavaScript 过滤关键字
Mar 20 Javascript
vue.js 底部导航栏 一级路由显示 子路由不显示的解决方法
Mar 09 Javascript
vue 界面刷新数据被清除 localStorage的使用详解
Sep 16 Javascript
vue插槽slot的理解和使用方法
Apr 03 Javascript
js的新生代垃圾回收知识点总结
Aug 22 Javascript
layui+jquery支持IE8的表格分页方法
Sep 28 jQuery
详解node-ccap模块生成captcha验证码
Jul 01 #Javascript
vue元素实现动画过渡效果
Jul 01 #Javascript
JavaScript学习总结之正则的元字符和一些简单的应用
Jun 30 #Javascript
node.js + socket.io 实现点对点随机匹配聊天
Jun 30 #Javascript
详解vue中computed 和 watch的异同
Jun 30 #Javascript
JS 组件系列之Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
Jun 30 #Javascript
vue2.0 axios前后端数据处理实例代码
Jun 30 #Javascript
You might like
PHP中实现进程间通讯
2006/10/09 PHP
杏林同学录(五)
2006/10/09 PHP
php checkbox 取值详细说明
2010/08/19 PHP
PHP数组无限分级数据的层级化处理代码
2012/12/29 PHP
ThinkPHP之R方法实例详解
2014/06/20 PHP
PHP将字符分解为多个字符串的方法
2014/11/22 PHP
php微信公众平台开发之获取用户基本信息
2015/08/17 PHP
PHP常量define和const的区别详解
2019/05/18 PHP
基于jquery的让textarea自适应高度的插件
2010/08/03 Javascript
JS随机生成不重复数据的实例方法
2013/07/17 Javascript
利用NodeJS和PhantomJS抓取网站页面信息以及网站截图
2013/11/18 NodeJs
利用jquery实现下拉框的禁用与启用
2016/12/07 Javascript
jquery——九宫格大转盘抽奖实例
2017/01/16 Javascript
Ionic3 UI组件之Gallery Modal详解
2017/06/07 Javascript
基于Vue2的独立构建与运行时构建的差别(详解)
2017/12/06 Javascript
详解React-Router中Url参数改变页面不刷新的解决办法
2018/05/08 Javascript
vue+element-ui实现表格编辑的三种实现方式
2018/10/31 Javascript
动态实现element ui的el-table某列数据不同样式的示例
2021/01/22 Javascript
[01:04:14]VP vs TNC 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python遍历文件夹并删除特定格式文件的示例
2014/03/05 Python
Python实现将doc转化pdf格式文档的方法
2018/01/19 Python
Python使用xlwt模块操作Excel的方法详解
2018/03/27 Python
Python 3.x 安装opencv+opencv_contrib的操作方法
2018/04/02 Python
mac下给python3安装requests库和scrapy库的实例
2018/06/13 Python
Python 如何在字符串中插入变量
2020/08/01 Python
Python 如何展开嵌套的序列
2020/08/01 Python
推荐10个HTML5响应式框架
2016/02/25 HTML / CSS
BrandAlley英国:法国折扣奢侈品网上零售商
2017/07/03 全球购物
英国最出名高街品牌:Forever Unique
2018/02/24 全球购物
美国渔具店:FishUSA
2019/08/07 全球购物
《自选商场》教学反思
2014/02/14 职场文书
信用卡工资证明格式
2014/09/13 职场文书
运动会闭幕式通讯稿
2015/07/18 职场文书
pytorch中[..., 0]的用法说明
2021/05/20 Python
SpringBoot2零基础到精通之异常处理与web原生组件注入
2022/03/22 Java/Android
Windows server 2012搭建FTP服务器
2022/04/29 Servers