Nodo登陆注册表单,数据库md5加密
按钮绑定AJAX发起post请求的事件,Node后台来处理。
doregist把数据插入mongo中,密码md5多重加密。
密码稍微长点,复杂点的,md5加密现在还不能反向破解。
以base64格式经md5加密后,长度固定。
dologin时,把接受的密码用同样公式的md5加密和数据库做对比。
regist.ejs:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!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>
login.ejs:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!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>
login.js:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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);
logindb.js:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//优化后,加入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();//关闭数据库 }); }); };
md5.js:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
var crypto = require("crypto"); module.exports = function (password) { var md5 = crypto.createHash("md5"); var password = md5.update(password).digest("base64"); return password; }