cookie及加密

命令:

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的参数说明:

  1. domain: 域名
  2. name=value:键值对,可以设置要保存的 Key/Value,注意这里的 name 不能和其他属性项的名字一样
  3. Expires: 过期时间(秒),在设置的某个时间点后该 Cookie 就会失效,如 expires=Wednesday, 09-Nov-99 23:12:40 GMT。
  4. maxAge: 最大失效时间(毫秒),设置在多少后失效 。
  5. secure: 当 secure 值为 true 时,cookie 在 HTTP 中是无效,在 HTTPS 中才有效 。
  6. Path: 表示 在那个路由下可以访问到cookie。
  7. httpOnly:是微软对 COOKIE 做的扩展。如果在 COOKIE 中设置了“httpOnly”属性,则通过程序(JS 脚本、applet 等)将无法读取到COOKIE 信息,防止 XSS 攻击的产生 。
  8. 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;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值