zoukankan      html  css  js  c++  java
  • 基于session的用户登录识别

    框架express

    依赖的session模块express-session

    1 主页面app.js

    var express = require('express');
    var path = require('path');
    var logger = require('morgan');
    var cookieParser = require('cookie-parser');
    var bodyParser = require('body-parser');
    var routes = require('./routes');
    var session = require('express-session');
    var index = require('./routes/index');
    var flash = require('connect-flash');
    
    var app = express();
    
    // view engine setup
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'jade');
    
    // 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.use(flash());
    app.use(session({
      name: 'kk',// 设置 cookie 中保存 session id 的字段名称
      secret: 'kk',// 通过设置 secret 来计算 hash 值并放在 cookie 中,使产生的 signedCookie 防篡改
      cookie: {
        maxAge: 2592000000// 过期时间,过期后 cookie 中的 session id 自动删除
      },
      resave: false,
      saveUninitialized: true, //本应用中是将session存储到内存中。
      //store: new MongoStore({// 将 session 存储到 mongodb
       //url: 'mongodb://localhost:27017/kk'// mongodb 地址
     //})
    }));
    app.use(function (req, res, next) {
      res.locals.user = req.session.user;  应用变量
      res.locals.showname = req.session.showname;
      res.locals.success = req.flash('success');
      res.locals.error = req.flash('error');
      next();
    });
    routes(app);
    
    // 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 路由文件index.js

    module.exports = function (app) {
      app.get('/', function (req, res) {
      if (!req.session.user) {    //如果未有用户登录,跳转至登录
        res.redirect('/login');
      }
      if (req.session.user) {
        res.redirect('/home'); //如果已经有用户登录,跳转至住页面
      }
      });
      app.use('/login', require('./login'));  //登录界面路由
      app.use('/home', require('./home'));  //  主页面路由
      app.use('/logout', require('./logout'));  //登出路由
    
      // 404 page
      app.use(function (req, res) {
        if (!res.headersSent) {
          res.render('404');
        }
      });
    };
    

    3 登录文件 login.js

    var express = require('express');
    var router = express.Router();
    var mysql = require('mysql');
    var md5 = require('md5');
    var connection = mysql.createConnection({host: '10.0.6.14', user: 'root', password: '123456', database: 'cop_c'});
    //连接数据库 connection.connect(); router.get('/', function(req, res, next) { key = req.query.key; if (!key || (key.length !== 32)) { //安全机制,为每一个登录用户分配一个32为的key,在登录时以 http://ip/login?key=12234...32进行登录,如果没有key或者key不是32位,显示空白页面。 res.send(''); } if (req.session.user) { //如果已有用户登录,则跳转至主页面。 res.redirect('/home'); } res.render('login'); }); router.post('/', function(req, res, next) { var user = req.body.user; var xx = req.body.passwd; var passwd = md5(xx); //数据库中存储的是经过md5加密的密码。 sql = 'select showname from o_users where username="' + user + '" ' + 'and passwd= "' + passwd + '"and `key`="' + key + '"';
    //showname是显示在主页面的用户名,存储在数据库中。 connection.query(sql, function(err, rows, fields) { if (err) throw err; if (rows.length==0) { //如果查询到数据库中有相匹配的用户,则登录,否则重新登录 req.flash('error', '用户密码错误') res.redirect('/login?key='+key); }else { req.session.showname=rows[0].showname; req.session.user = user; req.flash('success', '登录成功') res.redirect('/home?key='+key); } }); }); module.exports = router;

    4 主页面index.js

    var express = require('express');
    var router = express.Router();
    
    /* GET users listing. */
    router.get('/', function(req, res, next) {
      if(req.session.user){
          res.render('home',{name:req.session.showname})
      }else{
        res.redirect('/login')
      }
    
    });
    
    module.exports = router;
    

    5 登出文件logout.js

    var express = require('express');
    var router = express.Router();
    router.get('/', function(req, res, next) {
    req.session.user = null;
    req.session.showname = null;
    res.redirect('/login')
    
    });
    module.exports = router;
    

     6主页面模板 home.jade

    extends layout
    block content
      h1 #{showname} 
      h1 #{success}
      h1 #{error}
      a(href='/logout')登出
      p 这是主页
    

    7登录模板 login.jade

    extends layout
    
    block content
      .container
        h1 #{error}
        h1 #{success}
        form.form-signin(method="post", action="/login")
          h2 请登陆
          .form-group
            label.sr-only 用户名
            input.form-control#inputUser(placeholder="用户名", name="user", required, autofocus )
            label.sr-only 密码
            input.form-control#inputPassword(placeholder="密码", name="passwd",type="password" required, autofocus)
          button.btn.btn-lg.btn-primary.btn-block(type="submit") Sign in
    
  • 相关阅读:
    stdin和STDIN_FILENO的区别
    运算放大器和仪表放大器有哪些区别?
    仪表放大器与运算放大器的区别是什么?
    如何将库文件移到另一个库
    altium designer 中器件原理图库中,将一个器件分成几部分是如何操作的?就是如何用part表示?
    linux串口基本编程
    WCF寄宿(Host)之自我寄宿(Self-Hosting)简单实例【Windows应用程序宿主】
    WCF寄宿(Host)之自我寄宿(Self-Hosting)简单实例【Console应用为宿主】
    GUI创建各常用控件(二)
    GUI创建各常用控件(一)
  • 原文地址:https://www.cnblogs.com/jkklearn/p/6213031.html
Copyright © 2011-2022 走看看