zoukankan      html  css  js  c++  java
  • Nodo登陆注册表单,数据库md5加密

    按钮绑定AJAX发起post请求的事件,Node后台来处理。

    doregist把数据插入mongo中,密码md5多重加密。

    密码稍微长点,复杂点的,md5加密现在还不能反向破解。

    以base64格式经md5加密后,长度固定。

    dologin时,把接受的密码用同样公式的md5加密和数据库做对比。

    regist.ejs:

    <!DOCTYPE html>
    <html lang="zh-CN">
        <head>
        <meta charset="utf-8">
        <title>登陆</title>
        </head>
        <body>
            <div>
                <p>
                    登录名: <input type="text" id="username">
                </p>
                <p>
                    密码:<input type="password" id = "password">
                </p>
                <p>
                    <input type="submit" value="注册" id = "signin">
                </p>
                <script type="text/javascript" src = "/js/jquery-1.11.3.min.js"></script>
                <script type="text/javascript">
                    //用AJAX提交表单
                    $("#signin").click(function () {
                        $.post("/doregist",{
                            "username" : $("#username").val(),
                            "password" : $("#password").val()
                        },function (result) {
                            if(result == "1")
                                alert("注册成功");
                            else {
                                alert("注册失败");
                            }
                        })
                    })
                </script>
            </div>
        </body>
        </html>
    View Code

    login.ejs:

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="utf-8">
        <title>登陆</title>
    </head>
    <body>
    <div>
        <p>
            登录名: <input type="text" id="username">
        </p>
        <p>
            密码:<input type="password" id = "password">
        </p>
        <p>
            <input type="submit" value="登陆" id = "signin">
        </p>
        <script type="text/javascript" src = "/js/jquery-1.11.3.min.js"></script>
        <script type="text/javascript">
            //用AJAX提交表单
            $("#signin").click(function () {
                $.post("/dologin",{
                    "username" : $("#username").val(),
                    "password" : $("#password").val()
                },function (result) {
                    if(result == "1")
                        alert("登陆成功");
                    else {
                        alert("登陆失败");
                    }
                })
            })
        </script>
    </div>
    </body>
    </html>
    View Code

    login.js:

    var express = require("express");
    var app = express();
    var formidable = require("formidable");
    var db = require("./model/logindb.js");
    
    var md5 = require("./model/md5.js");
    
    
    app.set("view engine","ejs");
    
    app.use(express.static("./public"));
    
    app.get("/regist",function (req,res,next) {
        res.render("regist");
    });
    
    app.get("/login",function (req,res,next) {
        res.render("login");
    });
    
    //注册,中间件,注意加next
    app.post("/doregist",function (req,res,next) {
        var form = new formidable.IncomingForm();
        form.parse(req, function(err, fields, files) {
           var username = fields.username;
           var password = fields.password;
           //加密
    
            password = md5(md5(password).substr(4,7) + md5(password));
           db.insertOne("users",{
               "username" : username,
               "password" : password
           },function (err,result) {
               if(err) {
                   res.send("-1")
               }
               res.send("1");
           })
        });
    });
    
    app.post("/dologin",function (req,res,next) {
        var form = new formidable.IncomingForm();
        form.parse(req, function(err, fields, files) {
            var username = fields.username;
            var password = fields.password;
    
            //检索数据库,按登录名检索数据库,查看密码是否匹配
            db.find("users",{"username":username},function (err,result) {
                if(result.length == 0 ) {
                    res.send("-2");//-2没有这个人
                    return ;
                }
                var dbpassword = result[0].password;
                var mdpassword = md5(md5(password).substr(4,7) + md5(password));
                if(dbpassword == mdpassword) {
                    res.send("1");//成功
                }
                else {
                    res.send("-1");
                }
            });
    
        });
    });
    
    app.listen(3000);
    View Code

    logindb.js:

    //优化后,加入skip,limit参数的写法
    //这个模块里面封装了所有对数据库的常用操作
    var settings = require("../settings.js");
    var MongoClient = require('mongodb').MongoClient;
    
    //不管数据库什么操作,都是先连接数据库,所以我们可以把连接数据库
    //封装成为函数
    
    function _connectDB(callback) {
        var url = settings.dburl;
        MongoClient.connect(url, function (err,db) {
            if(err) {
                callback(err,null);
                return;
            }
            callback(err,db);
        });
    }
    
    exports.insertOne = function (collectionName, json, callback) {
        _connectDB(function (err,db) {
            if(err) {
                callback(err,null);
                return;
            }
            db.collection(collectionName).insertOne(json, function (err, result) {
                callback(err, result);
                db.close();//关闭数据库
            })
        });
    }
    
    exports.find = function (collectionName,json,C,D) {
        var result = [];   //结果数组
        //JS没有函数重载,只能手动实现
        if(arguments.length == 3) {
            //如果没有传args
            //那么参数C就是callback,参数D没有传。
            var callback = C;
            var skipnumber = 0;
            //数目限制,limit(0)就是没有限制
            var limit = 0;
        }else if(arguments.length == 4) {
            var args = C;
            var callback = D;
            //应该省略的条数
            var skipnumber = args.pageamount * args.page;
            //数目限制
            var limit = args.pageamount;
        }else {
            throw new Error("find函数的参数个数,必须是3个,或者4个");
            return;
        }
        //从第零页开始
        console.log("略过了"+skipnumber+"条"+"限制在"+limit+"条");
        //链接数据库,链接之后查找所有
        _connectDB(function (err,db) {
            var cursor = db.collection(collectionName).find(json).skip(skipnumber).limit(limit);
            cursor.each(function (err, doc) {
                if(err) {
                    callback(err,null);
                    db.close();
                    return;
                }
                if(doc != null) {
                    result.push(doc); //放入结果数组
                }else {
                    //遍历结束,没有更多的文档
                    callback(null,result);
                    db.close();//关闭数据库
                }
            });
        });
    }
    
    exports.deleteMany = function (collectionName,json,callback) {
        _connectDB(function (err, db) {
            //删除
            db.collection(collectionName).deleteMany(
                json,
                function (err, results) {
                    callback(err, results);
                    db.close();
                }
            );
        });
    }
    
    exports.updateMany = function (collectionName,json1,json2,callback) {
        _connectDB(function (err,db) {
            db.collection(collectionName).updateMany(
                json1,
                json2,
                function(err,results) {
                    callback(err,results);
                    db.close();//关闭数据库
                });
        });
    };
    View Code

    md5.js:

    var crypto = require("crypto");
    module.exports = function (password) {
        var md5 = crypto.createHash("md5");
        var password = md5.update(password).digest("base64");
    
        return password;
    }
    View Code
  • 相关阅读:
    十一、EnterpriseFrameWork框架的分层与系统业务的结合
    十八、【开源】EnterpriseFrameWork框架核心类库之Winform控制器
    进步的起点
    六、EnterpriseFrameWork框架基础功能之权限管理
    十四、EnterpriseFrameWork框架核心类库之简易ORM
    八、EnterpriseFrameWork框架基础功能之自定义报表
    五、利用EnterpriseFrameWork快速开发基于WebServices的接口
    十五、EnterpriseFrameWork框架核心类库之系统启动入口与初始化
    十二、EnterpriseFrameWork框架核心类库之与EntLib结合
    十七、EnterpriseFrameWork框架核心类库之Web控制器
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/7912239.html
Copyright © 2011-2022 走看看