客户端(login.art)
登录功能实现,表单要添加name属性,这样才能向服务器提交数据
<div class="login-body">
<div class="login-container">
<h4 class="title">黑马程序员 - 博客管理员登录</h4>
<div class="login">
<form action="/admin/login" method="post" id="loginForm">
<div class="form-group">
<label>邮件</label>
<input name="email" type="email" class="form-control" placeholder="请输入邮件地址">
</div>
<div class="form-group">
<label>密码</label>
<input name="password" type="password" class="form-control" placeholder="请输入密码">
</div>
<button type="submit" class="btn btn-primary">登录</button>
</form>
</div>
<div class="tips"></div>
</div>
</div>
服务器端(login.js)
通过引入body-parser模块处理post请求参数
通过引入boduParser的方式处理请求参数 urlencoded里边extended:值为
false时会使用querystring处理请求参数,当值为true时,会使用qs的方式
处理请求参数(推荐false)
//引入body-parser模块,处理请求参数
const bodypaser = require('body-parser');
//创建服务器
const app = express();
//处理post请求参数
app.use(bodypaser.urlencoded({ extended: false }));
服务器端(app.js)
登录成功和没成功结果是一样的,这是由于http的无状态性(因为网站基于
http协议,客户端和服务器端请求响应一次后就断开,只关心请求,完成后
就断开)因此必须要建立客户端和服务器端的关联关系,要借助cookie
sesson技术。引入express-session模块
模块返回一个方法,我们用session接受,调用该方法就可以在服务器端创建session对象。方法内部为请求对象创建一个session属性,用于存放用户数据,并生成sessionid(唯一对应该数据),放在客户端cookie中。当向服务器端请求数据时,方法内部会从客户端cookie中获取sessionid,服务器从而知道访问其用户,联系建立。
里边参数是秘钥,可自定义值,用于客户端cookie加密和服务器端cookie解密
//引入express-session模块 该模块返回一个方法,用变脸接收
const session = require('express-session');
app.use(session({
resave: false, //添加 resave 选项
saveUninitialized: true, //添加 saveUninitialized 选项
secret: 'aF,.j)wBhq+E9n#aHHZ91Ba!VaoMfC', // 建议使用 128 个字符的随机字符串
cookie: { maxAge: 60 * 1000 }
}));
服务器端(loginPage.js)
引入bcrypt.js进行密码加密处理
//引入user用户构造集合
const { User } = require('../../model/user');
//引入bcrypt模块进行密码加密处理
const bcrypt = require('bcryptjs');
module.exports = async (req, res) => {
const { email, password } = req.body
if (email.trim().length == 0 || password.trim().length == 0) {
return res.status(400).render('admin/error', { msg: '邮件或密码错误' });
}
// 根据邮箱查找用户(es6写法,键值对省略),找到则为用户集合对象,否则为空
let user =await User.findOne({ email });
if (user) {
//密码比对成功,则登录.使用await bcrypt.compare进行加密密码比对
let isVaild = await bcrypt.compare(password,user.password);
if (isVaild) {
//将用户名存储到请求参数中
req.session.username = user.username;
//同上将用户角色放在session中
req.session.role = user.role;
else {
return res.status(400).render('admin/error', { msg: '邮件或密码错误' });
}
} else {
return res.status(400).render('admin/error', { msg: '邮件或密码错误' });
}