基于express的登陆控制

唠叨几句

        web应用基于http协议传输,但因为http协议是无状态的,也就是说不具备记忆功能,这意味如果后续处理需要前面的信息,那么需要将前一步的信息重新传输。举个例子,淘宝购物的时候,都是先天订单,再支付,假设这两步分开进行的,那么当你填完订单需要支付时,需要将你的订单信息也再次提交,这样无形中增大了数据传输量,也显得麻烦,正因为如此,所以产生了cookie,每次请求时,都会在头部传递cookie用于传递前一步的信息,再说就多了,打住了,有兴趣的去查阅下http的请求结构  请求行 请求头与请求体,一般简称line header body.


为什么不说session?

        我习惯于将session看做一种特殊的cookie,cookie与session的区别我不多说,了解原理的同学会知道,session也是需要cookie来传递sessionid的,也就是说当客户端禁止掉cookie以后,你的session也会失效.所以我会围绕cookie来介绍.


express的cookie

       express框架内置了cookie模块,但如果要使用session,请确保安装了cookie-parser与express-session模块,没有没关系,万能的npm帮你搞定


       设置cookie

      

   response.cookie('username','zhangsheng',{expires: new Date(Date.now()+3600000),httpOnly:true, path:'/'});

      参数含义分别是cookie的名字,cookie的值, expires为过期时间,单位毫秒,httpOnly为http专用,https则无效,path是设置的域(/代表全域,关于域的概念请自行百度);

     

      访问cookie

      可以直接通过res.cookies来访问


      删除cookie

      通过内置api res.clearCookie('username'); 第二个参数为可选


      如何使用session?首先在app.js中编写如下:

      

app.use(session({
    //混淆的加密串随便填
    secret: '12345',
    //这里的name值得是传递sessionid的cookie的name,默认是:connect.sid
    name: 'web',
    //设置maxAge是60000ms,即60s后session和相应的cookie失效过期
    cookie: {maxAge: 60 * 1000 },
    //是指每次请求都重新设置session cookie,假设你的cookie是10分钟过期,每次请求都会再设置10分钟
    resave: true,
    //是指无论有没有session cookie,每次请求都设置个session cookie ,默认给个标示为 connect.sid
    saveUninitialized: false
}));

       设置session的值

        req.session.loginstatus = 1  loginstatus为名字


        读取session

        req.session


        删除session

        res.clearCookie('web'),有人可能纳闷了,明明要删除的是session,为什么会使用删除cookie的方法呢?再理解一下,session是一种特殊的cookie,我将传递sessionid的cookie删除掉,那么session也会失效,我设置的传递sessionid的cookie名称叫做web  所以我干掉web即可 服务端session时效到后会被自动清除掉


测试一下

分别编写login.js与article.js router  login中代码如下

var express = require('express');
var router = express.Router();

/**
 * 登陆页面
 */
router.get('/',function (request,response,next){
    response.render('login/index');
});

/**
 * 登陆处理  这块可改为数据库查询
 */
router.post('/submit',function (request,response,next){
    if(typeof request.body.username === 'undefined' ||  request.body.username === ''){
        response.json({code:1,message:"请提交用户名"});
    }
    var username = request.body.username;
    if(typeof request.body.password === 'undefined' ||  request.body.username === ''){
        response.json({code:1,message:"请提交用密码"});
    }
    var password = request.body.password;
    if(username != 'zhangsheng' || password !='123456'){
        response.json({code:1,message:"用户名或密码错误"});
    }else{
        request.session.loginstatus = 1;
        response.cookie('username','zhangsheng',{expires: new Date(Date.now()+3600000),httpOnly:true, path:'/'});
        response.redirect('/article');
    }
    response.end();
});


/**
 * loginout
 */
router.get('/out',function (request,response,next){
    response.clearCookie('username');
});


module.exports = router;

index页面非常简单 我使用的是ejs模版 如下

<!DOCTYPE html>
    <html>  
        <head>
            <meta http-equiv=“Content-Security-Policy” content=“upgrade-insecure-requests” />
            <title>登陆</title>
        </head>  
    <body>
        <form action="/login/submit" method="post">
            用户名:<input type="text" name="username" /><br />
            密码:<input type="password" name="password" /><br />
            <input type="submit" value="登陆"/>
        </from>
    </body>
</html>

然后是article.js

/**
 * 文章编辑页面
 */

var express = require('express');
var router = express.Router();

router.all('*',function (request,response,next){
    console.log(request.session);//这里输出session只为介绍session的访问方法

    if(typeof request.cookies.username == 'undefined' || request.cookies.username != 'zhangsheng'){
        response.json({message:'非法访问'});
        response.end();
    }
    next();
});


/**
 * 首页
 */
router.get('/',function (request,response,next){
    response.render('article/index');
});

/**
 * 提交数据
 */
router.post('/submit',function (request,response,next){
    
});


module.exports = router;

运行结果如下 登陆后


控制台输出设置的session信息


浏览器cookie如下




清除掉cookie再次访问 提示请登录!   访问控制完成。

本篇是一个很简单的使用介绍,很多东西可能讲解不到位,还请谅解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章