node + express 登录拦截器

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

思路是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;
时间: 2024-07-29 08:39:28

node + express 登录拦截器的相关文章

登录拦截器

经常可以看到一些网站需要输入口令才可以查看,这个效果是怎么实现的呢,现在来模拟一个场景,有一个网站必须登录之后才能继续,只需要设计一个登录拦截器(过滤器)就可以了: 项目大致如下: 大概逻辑是这样子的: 拦截器的代码: 1 package org.cc.practice.filter; 2 3 import java.io.IOException; 4 5 import javax.servlet.Filter; 6 import javax.servlet.FilterChain; 7 imp

struts2自定义登录拦截器

版权声明:本文为博主原创文章,未经博主允许不得转载. (1)配置web.xml,让xml加载struts2框架 <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSche

Spring mvc登录拦截器

自己实现的第一个Spring mvc登录拦截器 题目要求:拒绝未登录用户进入系统,只要发现用户未登录,则将用户请求转发到/login.do要求用户登录 实现步骤: 1.在spring的配置文件中添加登录拦截,如下: spring-web.xml <mvc:interceptors> <!-- 配置登陆拦截器 --> <mvc:interceptor> <mvc:mapping path="/**"/> //拦截所有请求 <mvc:e

java SpringMVC Filter登录拦截器

SpringMVC框架是一个非常强大的java web框架,目前最主流的也是spring mvc的框架今天我们学习下springMVCd的登录拦截器Filter 首先呢,SpringMVC具有统一的入口DIspatcherServlet,所有请求都会通过DIspatcherServlet来进行处理 dispatcherServlet是前置控制器,配置在web.xml中,主要是用来拦截对应的请求,然后将请求根据对应的规则发送到Controller来进行处理 首先在web.xml中进行配置拦截请求

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

1.问题出现的场景与解决 实现一个登录拦截器,重写doFilter方法,判断用户的登录状态,在用户长时间未操作或者异地登录时前端进行提示,完整代码如下 1 public class LoginValidateFilter implements Filter { 2 3 private String errorMessage; 4 private Logger log = LoggerFactory.getLogger(this.getClass()); 5 6 @Override 7 publi

node.js 实现一个简单的登录拦截器

拦截器在web开发中随处可见,比如站点的管理后台,不说所有人都能进入,所以就需要做一个拦截器并友好的跳转到提示页. 下面我们简单实现一种,判断用户是否登录成功,登录不成功的用户自动重定向到登录页面. 首先我们实现一个过滤器 exports.checkAuth=function(req, res, next) {     var token = req.signedCookies.token;     if (token && req.session.user && req.

BOS项目 第2天(BaseDao、BaseAction、用户登录、自定义strust登录拦截器)

BOS项目 第2天 今天内容安排: 1.根据提供的pdm文件生成sql 2.持久层和表现层设计---BaseDao.BaseAction 3.实现用户登录功能 4.jQuery EasyUI 消息提示控件 5.jQuery EasyUI  menubutton菜单按钮 6.自定义struts2拦截器,实现用户未登录自动跳转到登录页面 7.基于ajax实现修改密码功能 1. 根据pdm生成sql脚本 2. 设计持久层和表现层 2.1 持久层设计(基于泛型+反射) 通用接口: /** * 抽取持久层

Android登录拦截器实现方式(一)

对于App端来说,如果能保证用户在登录后能自动延续登录前的操作,将是非常不错的用户体验.所以专门花了点时间,想了两种方式来实现该种需求. 这篇文章讲先第一种方式,这种方式实现的思路大致是这样: 在执行需要登陆状态的操作时,将该操作交由拦截器处理,该拦截器会把该操作延后到登陆成功后处理. 举个例子,用户想查看个人资料,通常的做法是先判断登录与否,如果没有登录,得先去登录,然后从登录页返回后在onActivityResult中再执行相应的跳转.但如果使用拦截器后,你只需将个人资料页必要的信息(比如标

Spring MVC实现的登录拦截器

之前接触过struts拦截器,但是没有使用过Spring MVC拦截器,今天花了一天时间好好研究了一下. 定义拦截器 SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的.在SpringMVC 中定义一个Interceptor 非常简单,主要有两种方式,第一种方式是要定义的Interceptor类要实现了Spring 的HandlerInterceptor 接口,或者是这个类继承实现了HandlerInterceptor 接口的类,比如Sp