1.拦截器

拦截器可以根据需要 做权限拦截 登录只是权限的一种,

思路是req.session.user判断用户session是否存在,是否是需要拦截的地址,

如果是就跳转登录页,或其他页,

如果非需拦截页,则执行 next(); 放行

因为是顺序执行的所以 app.all('/*', function(req, res, next){   这个方法需放在定义的路由之上

具体写法如下:

//登录拦截器
app.all('/*', function(req, res, next){
if (req.session.user) {
next();
}else {
var arr = req.url.split('/');// 解析用户请求的路径 for (var i = 0, length = arr.length; i < length; i++) {// 去除 GET 请求路径上携带的参数
arr[i] = arr[i].split('?')[0];
}
if (arr.length > 1 && arr[1] == '') {// 判断请求路径是否为根、登录、注册、登出,如果是不做拦截
next();
} else if (arr.length > 2 && arr[1] == 'user' && (arr[2] == 'register' || arr[2] == 'login' || arr[2] == 'logout' || arr[2].indexOf('login') > 0 )) {
next();
} else { // 登录拦截
req.session.originalUrl = req.originalUrl ? req.originalUrl : null; // 记录用户原始请求路径
req.flash('error', '请先登录');
res.redirect('/user/login'); // 将用户重定向到登录页面
}
}
});

结尾附上我的app.js:

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var bodyParser = require('body-parser');
var hbs = require('hbs');
var flash = require('connect-flash'); var index = require('./routes/index');
var users = require('./routes/users');
var about = require('./routes/about');
var list_ = require('./routes/product/list');
var login = require('./routes/user/login');
var login_post = require('./routes/user/login_post'); var app = express(); app.use(cookieParser());
app.use(session({
secret: '123456',
cookie: {maxAge: 60 * 1000 * 30},
resave: false,
saveUninitialized: true
})); app.use(flash()); hbs.registerPartials(path.join(__dirname, 'views', 'partials' ));
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hbs'); var blocks = {}; hbs.registerHelper('extend', function(name, context) {
var block = blocks[name];
if (!block) {
block = blocks[name] = [];
} block.push(context.fn(this)); // for older versions of handlebars, use block.push(context(this));
}); hbs.registerHelper('block', function(name) {
var val = (blocks[name] || []).join('\n'); // clear the block
blocks[name] = [];
return val;
}); // uncomment after placing your favicon in /public
app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public'))); //登录拦截器
app.all('/*', function(req, res, next){
if (req.session.user) {
next();
}else {
var arr = req.url.split('/');// 解析用户请求的路径 for (var i = 0, length = arr.length; i < length; i++) {// 去除 GET 请求路径上携带的参数
arr[i] = arr[i].split('?')[0];
}
if (arr.length > 1 && arr[1] == '') {// 判断请求路径是否为根、登录、注册、登出,如果是不做拦截
next();
} else if (arr.length > 2 && arr[1] == 'user' && (arr[2] == 'register' || arr[2] == 'login' || arr[2] == 'logout' || arr[2].indexOf('login') >= 0 )) {
next();
} else { // 登录拦截
req.session.originalUrl = req.originalUrl ? req.originalUrl : null; // 记录用户原始请求路径
req.flash('error', '请先登录');
res.redirect('/user/login'); // 将用户重定向到登录页面
}
}
}); app.use('/', index);
app.use('/users', users);
app.use('/about', about);
app.use('/product/list', list_);
app.use('/user/login', login);
app.use('/user/loginPost', login_post); // 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');
}); module.exports = app;

2.request接口请求

request模块安装:$npm install request --save-dev

引入模块:var request = require('request');

可以传入一个callback回调函数 执行 请求后数据

 var url = "https://xxxxxx/login";
//var md5 = crypto.createHash('md5');//md5加密模块
//pwd = md5.update(pwd).digest('hex'); var formData = {
user_name: userName,
passwd: pwd,
access_token: "1"
};
request.post({url:url, formData: formData}, function(err, httpResponse, body) {
if (err) {
console.error('failed:', err);
callback && callback(err);
}else{
var data = eval('(' + body + ')');
if (data.errorCode == 0) {
var userInfo = data.data;
callback && callback(userInfo);
}
}
});

node express 登录拦截器 request接口请求的更多相关文章

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

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

  2. Struts2 在登录拦截器中对ajax请求的处理

    前言: 由于ajax请求不像http请求,可以直接进行页面跳转,你返回的所有东西,ajax都只会识别为一个字符串. 之前尝试的方法是在拦截器中返回一个标识给ajax,然后再在每一个ajax请求成功之后 ...

  3. 大型运输行业实战_day05_1_登录+注销+表单重复提交+登录拦截器

    1.登录 登录实现如下步骤: 1.在首页中添加登录按钮 html代码如下: <%@ page contentType="text/html;charset=UTF-8" la ...

  4. 用户登录拦截器查询到登录用户后如何将用户信息传递到后面的Controller

    taotao创建订单代码中之前忘了加入用户信息,那么加上呢? 分析:用户创建订单的时候,我们会强制要求用户先登录,也就是说,创建订单的Controller执行时,一定是用户已经登录了的,而用户只要登录 ...

  5. 学习axios必知必会(2)~axios基本使用、使用axios前必知细节、axios和实例对象区别、拦截器、取消请求

    一.axios的基本使用: ✿ 使用axios前必知细节: 1.axios 函数对象(可以作为axios(config)函数使用去发送请求,也可以作为对象调用方法axios.request(confi ...

  6. Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求

    Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求 >>>>>>>>>>>>>>&g ...

  7. Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,java 判断请求是不是ajax请求

    Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,java 判断请求是不是ajax请求   Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求 java ...

  8. sessionStorage记录返回前端的数据,用于解决登录拦截器刷新页面的问题

    1.问题出现的场景与解决 实现一个登录拦截器,重写doFilter方法,判断用户的登录状态,在用户长时间未操作或者异地登录时前端进行提示,完整代码如下 public class LoginValida ...

  9. 实现Feign请求拦截器,对请求header等参数进行转发

    参考:Feign传递请求头信息(Finchley版本) 问题:通过Feign远程调用服务,无法传递header参数. 解决方式:实现RequestInterceptor接口(对所有的Feign请求进行 ...

随机推荐

  1. HTC vive VR设备软硬件安装+运行unity开发的VR程序

    总结在HTC vive VR开发过程中的HTC vive的安装调试 1.首先确保电脑的配置满足要求: 进入官网,测试电脑是否满足要求 链接:https://www.vive.com/us/produc ...

  2. 小程序wx.request的POST方法的参数传输服务器接收不到

    这是API里面的例子: 而实际这样,服务端拿到的是空值. 将header更改一下,application/x-www-form-urlencoded,则可以让服务器收到数据

  3. 【CCPC-Wannafly Winter Camp Day4 (Div1) H】命命命运(概率DP)

    点此看题面 大致题意: 有\(6\)个人玩大富翁,共有\(n\)块地,进行\(500\)轮,已知每个人掷骰子掷出\(1\sim6\)的概率.当某人到达一块未被占领的地时,他可以占领它.求最后每个人占有 ...

  4. poj 2115 扩展欧几里得

    题目链接:http://poj.org/problem?id=2115 题意: 给出一段循环程序,循环体变量初始值为 a,结束不等于 b ,步长为 c,看要循环多少次,其中运算限制在 k位:死循环输出 ...

  5. 2018.7.18 div,section,article的区别和使用

    section ·<section> 标签定义文档中的节(section.区段).比如章节.页眉.页脚或文档中的其他部分. ·section用作一段有专题性的内容,一般在它里面会带有标题. ...

  6. 奇异值分解(SVD)和最小二乘解在解齐次线性超定方程中的应用

    奇异值分解,是在A不为方阵时的对特征值分解的一种拓展.奇异值和特征值的重要意义相似,都是为了提取出矩阵的主要特征. 对于齐次线性方程 A*X =0;当A的秩大于列数时,就需要求解最小二乘解,在||X| ...

  7. 2、SpringBoot+Mybatis整合------一对一

    开发工具:STS 代码下载链接:https://github.com/theIndoorTrain/SpringBoot_Mybatis01/tree/93398da60c647573645917b2 ...

  8. Java学习过程中的收获

    1. String <--> Date 这种转换要用到java.text.SimpleDateFormat类 字符串转换成日期类型: 方法1: 也是最简单的方法 Date date=new ...

  9. Erwin 简单使用

    1. 物理设计:汉译英过程 ① Logical 中操作:Tools-Names-Edit Naming Standards…-Glossary选项import,导入内容为编辑好的CSV文件(只包含中文 ...

  10. 通过增量备份恢复来处理Oracle DG 复制GAP

    1.确定增备scn范围,通过alert日志获取gap日志序列GAP - thread 1 sequence 109631-117170 2.根据序列获取增备起点SCN提示最小gap序列为109631, ...