基于express的登陆控制

    xiaoxiao2021-03-25  84

    唠叨几句

            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再次访问 提示请登录!   访问控制完成。

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

    转载请注明原文地址: https://ju.6miu.com/read-11266.html

    最新回复(0)