1、express处理post请求

借助body-parse中间件,其实最终我们也不会使用这个

对于get请求,无需中间件,用req.query即可返回相应的数据

但是post我们尝试借助中间件处理

const express = require('express')
const es = require('express-static')
const bp = require("body-parser") let server = express() server.use(bp.urlencoded({
extended: false,//是否启用扩展模式
limit: 2 * 1024 * 1024//限制接收post数据的大小,100k默认 })) //中间处理,共有2个参数 server.use('/', function (req, res) {
console.log(req.body)
}) server.listen(8080, () => console.log('server is running')) <!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<script src="./ajax.js"></script> <body>
<form action="http://localhost:8080" method="post">
用户名:<input type="text" name="user" id="user"><br />
密码:<input type="passsword" name="pwd" id="pwd">
<input type="submit" value="登录" id="login">
</form> </body>
<script>
window.onload = function () { } </script> </html>
const express = require('express')
const es = require('express-static')
const bp = require("body-parser") let server = express() server.use(bp.urlencoded({
extended: false,//是否启用扩展模式
limit: 2 * 1024 * 1024//限制接收post数据的大小,100k默认 })) //中间处理,共有2个参数 server.use('/', function (req, res, next) {//use的第一个参数缺省,将响应所有的路径 console.log(req.body)
req.a = 12
//next适用来表明需要进行下一步的链式操作的,否则直接结束响应
//进行链式操作的use的url务必一致,本函数体内数据在下一个相应的use内仍有效
next()
}) server.use('/',function(){
console.log(req.a)
}) server.listen(8080, () => console.log('server is running'))

2、尝试编写中间件

const express = require('express')
const es = require('express-static')
const bp = require("body-parser")
const qs = require("querystring") let server = express() //自己编写的处理post请求的中间件
server.use(function (req, res, next) {
let str = ''
req.on('data', function (data) {
str += data
})
req.on('end', function () {
req.body = qs.parse(str)
next()
})
}) server.use('/', function (req, res) {
console.log(req.body)
console.log('finished')
}) server.listen(8080, () => console.log('server is running'))

2)进行封装

const qs = require("querystring")

module.exports=function (req, res, next) {
let str = ''
req.on('data', function (data) {
str += data
})
req.on('end', function () {
req.body = qs.parse(str)
next()
})
}

3)总结

const qs = require("querystring")

module.exports=function (req, res, next) {
let str = ''
req.on('data', function (data) {
str += data
})
req.on('end', function () {
req.body = qs.parse(str)
next()
})
}

4、cookie/session

session存储在服务端,比较安全,seession是基于cookie存在的

const qs = require("querystring")

module.exports=function (req, res, next) {
let str = ''
req.on('data', function (data) {
str += data
})
req.on('end', function () {
req.body = qs.parse(str)
next()
})
}

操作这两个存储需要使用到的中间件是cookie-parser cookie-session

简单地使用cookie

const express = require('express')

let server = express()

server.use('/', function (req, res) {
res.cookie('user', 'cc', {
path: '/',//哪个目录下可以读取这个cookie
maxAge: 30 * 24 * 3600 * 1000//一个月有效时间
})//共三个参数:键、值、设置其他cookie参数的对象 res.send('ok啦')
}) server.listen(8080, function () {
console.log('server is running')
})

使用签名的cookie

const express = require('express')
const cp = require('cookie-parser') let server = express() server.use(cp('esfwegethg'))//密钥,必须和下面的secret对应,可省略 //cookie是可以向上访问的
server.use('/', function (req, res) {
req.secret='esfwegethg'
//进行签名,可以防止用户端篡改
res.cookie('user', 'blue', { signed: true })//s开头,进行了签名 console.log(req.cookies)//这里打印的是没有进行签名的cookie
console.log(req.signedCookies)//这里打印的是进行签名的cookie
res.send('ok啦')
}) server.listen(8080, function () {
console.log('server is running')
})

res.clearCookie('键’)//删除cookie

使用cookie-encrypter中间件能更好地为cookie进行加密解密

但cookie一般不加密,session是强制我们进行加密的

2)使用session

const express = require('express')
const cp = require('cookie-parser')
const cs = require('cookie-session') let server = express() server.use(cp())
server.use(cs({
  name:"cc"//自定义sesion id 键名
//必须,强制加密以保证session数据安全
keys: ['aaa', 'bbb', 'ccc'],
   maxAge:24*3600*1000//设置session有效期
})) //cookie是可以向上访问的
server.use('/', function (req, res) {
if (!req.session["count"]) {
//记录访问次数
req.session["count"] = 1
} else {
req.session["count"]++
} console.log(req.session['count'])
res.send('ok啦')
}) server.listen(8080, function () {
console.log('server is running')
})

使用后cookie中会存有两个cookie,一个session,即session id,一个session.sig,是一个签名,

删除session:

delete req.session

node03的更多相关文章

  1. 网站日志流量分析采集(LuaJIT系统环境部署-node03,相关jar包自己手动上传)

    注:/usr/local/src 是源码包路径,可以自己更改 服务器中安装依赖 yum -y install gcc perl pcre-devel openssl openssl-devel 上传 ...

  2. Keepalived 配置实例

    Keepalived 是一款轻量级HA集群应用,它的设计初衷是为了做LVS集群的HA,即探测LVS健康情况,从而进行主备切换,不仅如此,还能够探测LVS代理的后端主机的健康状况,动态修改LVS转发规则 ...

  3. Puppet3在CentOS6.5集群下的安装

    环境:3台主机, IP分别为10.211.55.11.12.13 puppet master安装在10.211.55.11 puppet agent安装在10.211.55.11.12.13 1.安装 ...

  4. 解决zabbix图中出现中文乱码问题 图中的中文会变成方块

    [root@node03 src]# wget http://down1.chinaunix.net/distfiles/ttf-arphic-uming_0.0.20050501-1.tar.gz ...

  5. 分布式架构高可用架构篇_02_activemq高可用集群(zookeeper+leveldb)安装、配置、高可用测试

    参考: 龙果学院http://www.roncoo.com/share.html?hamc=hLPG8QsaaWVOl2Z76wpJHp3JBbZZF%2Bywm5vEfPp9LbLkAjAnB%2B ...

  6. 分布式架构高可用架构篇_01_zookeeper集群的安装、配置、高可用测试

    参考: 龙果学院http://www.roncoo.com/share.html?hamc=hLPG8QsaaWVOl2Z76wpJHp3JBbZZF%2Bywm5vEfPp9LbLkAjAnB%2B ...

  7. 【转载】图解:二叉搜索树算法(BST)

    原文:图解:二叉搜索树算法(BST) 摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!“岁月极美,在于它必然的流逝”“春花 秋月 夏日 冬雪”— ...

  8. 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

    // test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  9. Advanced Awk for Sysadmins

    转:http://www.linuxforu.com/2011/06/advanced-awk-for-sysadmins/ By Vishal Bhatia on June 1, 2011 in H ...

随机推荐

  1. jmeter分布式测试教程和远程的代理机无法连接网络的问题解决方法

    一.Jmeter分布式执行原理: 1.Jmeter分布式测试时,选择其中一台作为控制机(Controller),其它机器做为代理机(Agent). 2.执行时,Controller会把脚本发送到每台A ...

  2. pycharm安装package时报错

    在pycharm pip 包时,提示报错:module 'pip' has no attribute 'main' 原因:由于我的是pip 18.1 版本里没有main() 解决方法: 如不降级 pi ...

  3. Spring中@Component注解,@Controller注解详解

    在使用Spring的过程中,为了避免大量使用Bean注入的Xml配置文件,我们会采用Spring提供的自动扫描注入的方式,只需要添加几行自动注入的的配置,便可以完成 Service层,Controll ...

  4. 将OrCAD Capture CIS的设计文件(.dsn)导入到PADS Logic VX.2.3

    操作系统:Windows 10 x64 工具1:PADS Logic VX.2.3 启动PADS Logic VX.2.3,选择菜单:File > Import... 在File Import对 ...

  5. SpringBoot jar 注册windows服务

    1.pom.xml中添加 <plugin> <groupId>cn.joylau.code</groupId> <artifactId>joylau-s ...

  6. 64位windows8.1下安装 ImageMagick 总结

    1.  安装 ImageMagick-6.7.7-Q16-x64 下载地址:http://ftp.sunet.se/pub/multimedia/graphics/ImageMagick/binari ...

  7. 末学者笔记--Linux权限管理

    一.权限概述 Linux系统一般将文件可存/取访问的身份分为3个类别:owner(拥有者).group(和所有者同组的用户).others(其他人,除了所有者,除了同组的用户以及除了超级管理员),且3 ...

  8. [原创]Modelsim后仿真

    因调试需要,进行后仿真,ISE生成的sim文件和sdf文件 `timescale ns/ ps module lut_dly ( clkout, fpga_clk, config_in ); outp ...

  9. xss攻击与防御

    一.XSS攻击 Cross Site Scripting跨站脚本攻击 利用js和DOM攻击. 盗用cookie,获取敏感信息 破坏正常页面结构,插入恶意内容(广告..) 劫持前端逻辑 DDos攻击效果 ...

  10. rpm和yum软件管理

    rpm简介 数据库管理工具,通过读取数据库,判断软件是否安装,如已安装可读取出来所有文件的所在位置等,并可以实现删除这些文件. rpm:RPM is Redhat Package Manager(递归 ...