1、Cookie
HTTP是无状态协议。简单地说,当你浏览了一个页面,然后转到同一个网站的另一个页面,服务器无法认识到,这是同一个浏览器在访问同一个网站。每一次的访问,都是没有任何关系的。
Cookie是一个很简单的想法:当访问一个页面的时候,服务器在下行HTTP报文中,命令浏览器存储一个字符串;浏览器再访问同一个域的时候,将把这个字符串携带到上行HTTP请求中。
第一次访问一个服务器,不可能携带cookie。 必须是服务器得到这次请求,在下行响应报头中,携带cookie信息,此后每一次浏览器往这个服务器发出的请求,都会携带这个cookie。
特点
● cookie是不加密的,用户可以自由看到;
● 用户可以删除cookie,或者禁用它
● cookie可以被篡改
● cookie可以用于攻击
● cookie存储量很小。未来实际上要被localStorage替代,但是后者IE9兼容。
cookie使用:要引入var cookieParser = require('cookie-parser');
app.use(cookieParser());
app.get('/',function (req,res) {
//设置cookie
res.cookie('xihao','zhaoliying',{
//maxAge在express中以毫秒为单位;
maxAge:100000,
httpOnly:true
})
res.send(req.cookies)//获取cookie
});
2、session
- Session不是一个天生就有的技术,而是依赖cookie。当一个浏览器禁用cookie的时候,登录效果消失;或者用户清除了这个cookie,登录也消失;
- session比cookie不一样在哪里呢?session下发的是乱码,并且服务器自己缓存一些东西;下次浏览器带着乱码上来,此时与缓存进行比较,看看是谁?
- nodejs中的session用中间件:
express-session
;
cookie和session的区别:
- cookie是明码;session是乱码;
- cookie存在客户端浏览器; session存在服务器;
- cookie内存小;session内存大;
3、使用session实现登录
/**
* Created by 黄森 on 2017/7/25.
*/
var express = require('express');
var app = express();
var session = require('express-session');
var db = require('./model/db.js');
//使用中间件session
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true
}));
//设置模板引擎
app.set("view engine", "ejs");
//加载登录页面
app.get('/login',function (req,res) {
res.render('login');
});
//当你登录成功后访问/index时就会显示你已经登录
app.get('/index',function (req,res) {
if(req.session.login==1){
res.send("你好,欢迎"+req.session.username);
}else {
res.send("你还没有登录")
}
});
app.get('/checkLogin',function (req,res) {
var username = req.query.username;
var password = req.query.password;
db.find('user',{"username":username},function (err,result) {
if(result.length==0){
res.send("用户名错误,没有这个用户")
}
else if(result[0].password==password){
req.session.login='1',
req.session.username = result[0].username;
res.send("成功登陆!你是" + result[0].username);
}else {
res.send('密码错误');
}
})
});
app.listen(3000);
登录页面login.ejs
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>登录</title>
</head>
<body>
<form action="/checkLogin" method="get">
<p>用户名:<input type="text" name="username"></p>
<p>密 码:<input type="text" name="password"></p>
<p><input type="submit"></p>
</form>
</body>
</html>
网友评论