命令:
express --view=ejs cookieapp
cnpm install
nodemon ./bin/www
app.js的基本内容
// 错误处理
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
// 输出日志
var logger = require('morgan');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var app = express();
// view engine setup
// 视图设置
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
// express中间件
app.use(logger('dev')); //日志信息解析
// 请求对象解析
app.use(express.json()); //body解析
app.use(express.urlencoded({
extended: false
})); //post解析
app.use(cookieParser()); //cookie解析
app.use(express.static(path.join(__dirname, 'public')));
// 如果没有静态文件,走下面
// 路由匹配
app.use('/', indexRouter);
app.use('/users', usersRouter);
// catch 404 and forward to error handler
// 如果也没有路由匹配,就报404错误,或者使用页面渲染
// 设置404的中间件
app.use(function (req, res, next) {
res.render('404.ejs');
// next(createError(404));
});
// error handler
// 处理错误的中间件
app.use(function (err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
设置cookie
router.get('/setcookie', function (req, res) {
// 基础设置cookie,有效期默认为1个会话(浏览器关闭即失效)
// res.cookie("isLogin", "true");
// 10s ;httpOnly: true :前端不能发现,隐藏isLogin=true,但是http协议可以看见,防止前端操作
res.cookie("isLogin", "true", {
maxAge: 100000,
httpOnly: true
});
res.send("cookie设置成功");
})
router.get('/admin', function (req, res) {
if (req.cookies.isLogin == 'true') {
res.send("成功");
} else {
res.send("失败");
}
})
关于设置cookie的参数说明:
- domain: 域名
- name=value:键值对,可以设置要保存的 Key/Value,注意这里的 name 不能和其他属性项的名字一样
- Expires: 过期时间(秒),在设置的某个时间点后该 Cookie 就会失效,如 expires=Wednesday, 09-Nov-99 23:12:40 GMT。
- maxAge: 最大失效时间(毫秒),设置在多少后失效 。
- secure: 当 secure 值为 true 时,cookie 在 HTTP 中是无效,在 HTTPS 中才有效 。
- Path: 表示 在那个路由下可以访问到cookie。
- httpOnly:是微软对 COOKIE 做的扩展。如果在 COOKIE 中设置了“httpOnly”属性,则通过程序(JS 脚本、applet 等)将无法读取到COOKIE 信息,防止 XSS 攻击的产生 。
- singed:表示是否签名cookie, 设为true 会对这个 cookie 签名,这样就需要用 res.signedCookies 而不是 res.cookies 访问它。被篡改的签名 cookie 会被服务器拒绝,并且 cookie 值会重置为它的原始值。
httpOnly: true :前端不能发现,隐藏isLogin=true,但是http协议可以看见,防止前端操作
加密cookie
app.use(cookieParser('secret'));
signed: true表示加密
router.get('/setcookie', function (req, res) {
// 设置加密操作
// signed: true表示加密
res.cookie('login', 'true', {
signed: true
});
res.send("cookie设置成功");
})
加密之后的值在req.signedCookies,不在req.cookies中
router.get('/adminSecret', (req, res) => {
// 加密之后的值在req.signedCookies,不在req.cookies中
console.log(req.signedCookies);
if (req.signedCookies.login == 'true') {
res.send("加密cookie,成功");
} else {
res.send("加密cookie,失败");
}
})
// 加密原理解析
router.get('/secret', (req, res) => {
// 需要加密的字符串
let password = '123456';
// 使用的加密算法
let sf = crypto.createHash('md5');
// update:用来加密
sf.update(password);
// 加密的二进制数据以字符串的形式
let content = sf.digest('hex');
res.send(content);
})
// 自己定义加密cookie
router.get('/appSecret', (req, res) => {
let secretStr = jiami('true');
res.cookie('register', secretStr);
// 设置将加密的密文和明文内容放置在某个位置
setSecretCookie("true", secretStr);
res.send("cookie加密成功");
})
// 获取自己加密的cookie值
router.get('/getAppSecret', (req, res) => {
let strSecret = req.cookies.register;
content = getSecretCookie[strSecret];
console.log("解密后register的内容:", content);
res.send("解密后register的内容:" + content);
})
let secretCookie = {
}
function setSecretCookie(str, secretStr) {
secretCookie[secretStr] = str;
}
function getSecretCookie() {
return secretCookie[secretStr];
}
// 密码后面跟的随机值
let randomNum = Math.random();
function jiami(str) {
// 需要加密的字符串
let password = str;
password = password + 'xxy' + randomNum;
// 使用的加密算法
let sf = crypto.createHash('md5');
// update:用来加密
sf.update(password);
// 加密的二进制数据以字符串的形式
let content = sf.digest('hex');
// res.send(content);
return content;
}