node+express 配置安装以及数据解析,cookie,session
一、express安装,创建服务
(1)安装:npm install express --save
(2)创建服务 server.js:
const express = require('express') const server = express()
server.use('/a.html', function(req, res) { res.send('abc') res.end() }) server.use('/b.html', function(req, res) { res.send({ok: false, msg: '失败'}) res.end() }) server.get('/',(req, res)=> { console.log('有get') })
server.post('/',(req, res)=> { console.log('有post') })
server.listen(8000)
express请求包含post,get, use 等,而use既可以接收post请求,也可以接收get请求:
1 <form action="http://localhost:8000" method='get'> 2 用户:<input type="text"> <input type="submit" value='提交'> 3 </form>
当点击提交时,打开终端执行 node server.js:
执行日志:
同样将form表单中的method改为post请求,执行结果:
而当server.js中,的use请求方式,无论form表单的请求为get还是post, server.js中的use都会执行;
二、数据解析
上面介绍到数据可以通过get或者post请求传递参数,那后台如何获取数据呢?
get方式获取数据:
1 const express = require('express') 2 const server = express() 3 server.get('/login', (req, res) => { 4 console.log(req.query) //可以通过req.query直接获取参数 5 }) 6 7 server.listen(8000)
post方式获取数据:需要通过 bodyParser中间件去获取
1 const express = require('express') 2 const server = express() 3 const bodyParser = require('bodyParser') //中间件 4 server.use(bodyParser.urlencoded({ 5 extended: true, //扩展模式 6 limit: 2*1024*1024 //限制 默认100k 7 })) 8 server.use('/', (req, res) => { 9 console.log(req.query) //get 10 console.log(req.body) //post请求获取数据 11 }) 12 server.listen(8000)
三、next链式调用
1 const express = require('express') 2 const server = express() 3 server.listen(8000) 4 server.use(function(req, res, next) { 5 req.a = 12 6 next() //加上next() 之后,下面的use还会继续执行 7 }) 8 server.use('/', function(req, res) { 9 console.log(req.a) 10 })
四、cookie、session
cookie :在浏览器保存一些数据,每次请求都会带过来
缺点:不安全,大小有限(4k);可以再 浏览器通过 document.cookie = [key= value]; //修改后,可查看到最新的cookie值
session:保存数据,保存在服务端 相对于cookie安全; session是基于cookie实现的
cookie中会有一个session的id,服务器利用sessionid找到session文件,读取,写入;
缺点:session劫持,别的用户在你当前电脑上查看sessionid ,然后通过自己的电脑利用你的sessionid身份去操作。
1. cookie的使用
1 const express = require('express') 2 var server = express() 3 const cookieParser = require('cookie-parser') //获取cookie 4 server.use(cookieParser()) 5 server.use('/aaa/a.html', (req, res) => { 6 //发送cookie 7 res.cookie('user', 'blue', {path: '/aaa', maxAge: 30*24*3600*1000}) //path指访问路径,maxAge 有效期 8 9 //删除cookie 10 res.clearCookie('user') // 11 res.send('ok2') 12 })
为解决cookie的安全问题,我们可使用签名的方法,对cookie进行身份验证;
使用签名后,会导致最终数据变大,考虑到cookie的大小限制,尽量避免对所有的cookie进行签名;
1 const express = require('express') 2 var server = express() 3 const cookieParser = require('cookie-parser') //获取cookie 4 const cookieEncrypter = require('./cook') //加密 5 //cookie 6 server.use(cookieParser('sdsdsdl')) 7 //加密: server.use(cookieEncrypter('sfdfdff')) 8 server.use('/aaa/a.html', (req, res) => { 9 //发送cookie 10 // res.cookie('user', 'blue', {path: '/aaa', maxAge: 30*24*3600*1000}) //path指访问路径,maxAge 有效期 11 // console.log(req.cookies) //读取 cookie 12 req.secret = 'sdsdsdl' //加密 实际当中应该存在后台 如果server.use(cookieParser('sdsdsdl'))里面加了签名字符串,
这一行可省略,因为cookieParser会自动为其添加这个属性 13 res.cookie('user', 'blue', {signed: true}) //签名还是能看到原数据,但是可以防止修改 14 15 //通过 decodeURIComponent('s%3Ablue.MRdJDwCo2b6xWz8LU%2FjukagSIY%2BMC85saYdGHb1%2Bp0U') === s:blue.xxxxx s代表是签名过的 16 17 //当签名后,再获取,获取的是签名后的数据,如果需要获取原来未签名的数据,需要:在server.use(cookieParser('这里是密钥内容')) 添加密钥内容 18 // console.log(req.cookies) //此时获取的数据是 未加密钥的原始数据 19 console.log('签名cookie', req.signedCookies) 20 console.log('无签名cookie', req.cookies) 21 22 //删除cookie 23 res.clearCookie('user') // 24 25 26 res.send('ok2') 27 }) 28 server.listen(8000)
2. session的使用
1 const express = require('express') 2 const server = express() 3 const cookieParser = require('cookie-parser') 4 const cookieSession = require('cookie-session') 5 server.use(cookieParser()) 6 server.use(cookieSession({ //当再当前页面不操作的时候,session会被清除,以免session被劫持 7 name: 'sess', 8 keys: ['aaa', 'bbb', 'ccc'], //数组越长,越安全 9 maxAge: 2*3600*1000, //2小时 10 })) 11 server.use('/', (req, res) => { 12 // console.log(req.session) 13 if (req.session['count']==null) { 14 req.session['count'] = 1 15 } else { 16 req.session['count']++; 17 } 18 console.log(req.session['count']) 19 // delete req.session//删除 20 res.send('session') 21 }) 22 23 server.listen(8000)
对比可见,cookie数据是在浏览器的,而session数据是在服务端的,所以可以直接使用delete去删除当前session属性;