一、Cookie与Session简介
cookie是服务器写在客户端的数据。
session是服务器记录在服务器上的数据。
二、设置Cookie
1、server.js:
const Koa = require("koa"); // 引入Koa构造函数
const router = require("koa-router")();
const views = require("koa-views");
const nunjucks = require("nunjucks");
const app = new Koa(); // 创建应用
// 设置路径,并且告知使用的模板引擎为:nunjucks
app.use(views(__dirname + "/views", {
map: {
html: "nunjucks"
}
}))
// 首页路由
// ctx:上下文对象
router.get("/", async (ctx) => {
ctx.cookies.set("username", "xiaoming");
ctx.body = "cookie";
})
app.use(router.routes());
// 设置监听端口
app.listen(3000, () => {
console.log("server is running");
})
2、打开首页,F12中,网络,查找Cookie:
可以看到username已经存到cookie里面了。
这是响应的Cookie,是服务器给客户端发的。
我们再次刷新,会发现,请求的也有这个username的cookie数据了。
三、获取Cookie
1、新增【/test】路由:
router.get("/test", async (ctx) => {
let username = ctx.cookies.get("username");
ctx.body = username;
})
2、访问【/test】页面:
如上图,已经获取到了Cookie值。
四、利用cookie获取登录次数
1、更改【/test】路由:
router.get("/test", async (ctx) => {
let count = ctx.cookies.get("count");
// 如果有存在cookie,则每次访问,cookie值都加1
if (count > 0) {
++count;
ctx.cookies.set("count", count, {
// 设置cookie过期时间
maxAge: 2000,
})
} else {
// 如果没有cookie值,则说明初次访问,设为1
count = 1;
ctx.cookies.set("count", count);
}
ctx.body = count;
})
2、打开页面,测试
五、设置Session
1、安装koa-session插件
cnpm install --save koa-session
2、修改server.js:
const Koa = require("koa"); // 引入Koa构造函数
const app = new Koa(); // 创建应用
const router = require("koa-router")();
const views = require("koa-views");
const session = require("koa-session");
// 设置密钥(这边我们手动设置)
app.keys = ["123456"]
// 设置路径,并且告知使用的模板引擎为:nunjucks
app.use(views(__dirname + "/views", {
map: {
html: "nunjucks"
}
}))
// 设置session
app.use(session({
maxAge: 30000
}, app));
// 首页路由
// ctx:上下文对象
router.get("/", async (ctx) => {
ctx.cookies.set("username", "xiaoming");
ctx.body = "cookie";
})
router.get("/test", async (ctx) => {
let count = ctx.cookies.get("count");
// 如果有存在cookie,则每次访问,cookie值都加1
if (count > 0) {
++count;
ctx.cookies.set("count", count, {
// 设置cookie过期时间
maxAge: 2000,
})
} else {
// 如果没有cookie值,则说明初次访问,设为1
count = 1;
ctx.cookies.set("count", count);
}
ctx.body = count;
})
// 设置session页面
router.get("setSession", async (ctx) => {
ctx.session.user = "sessionUser";
ctx.body = "设置session页面";
})
// 获取session页面
router.get("getSession", async (ctx) => {
let user = ctx.session.user;
ctx.body = user;
})
app.use(router.routes());
// 设置监听端口
app.listen(3000, () => {
console.log("server is running");
})
关键代码:
const session = require("koa-session");
// 设置密钥(这边我们手动设置)
app.keys = ["123456"]
// 设置session
app.use(session({
maxAge: 30000
}, app));
// 设置session页面
router.get("setSession", async (ctx) => {
ctx.session.user = "sessionUser";
ctx.body = "设置session页面";
})
// 获取session页面
router.get("getSession", async (ctx) => {
let user = ctx.session.user;
ctx.body = user;
})
3、访问/setSession:
响应Cookie,是服务器发给客户端的,加密的Cookie。
4、访问/getSession:
六、使用Session和Cookie实现登陆验证
1、server.js,logout.html模板页,index.html首页,login.html登录页,list.html列表页
登录页输入用户名,密码,成功后,跳转到列表页。并且存放session。session过期时间3秒。
列表页可以注销,注销后,返回首页,session清除。
2、server.js
const Koa = require("koa"); // 引入Koa构造函数
const app = new Koa(); // 创建应用
const router = require("koa-router")();
const views = require("koa-views");
const parser = require("koa-parser");
const session = require("koa-session");
// 设置密钥(这边我们手动设置)
app.keys = ["123456"]
app.use(parser());
// 设置路径,并且告知使用的模板引擎为:nunjucks
app.use(views(__dirname + "/views", {
map: {
html: "nunjucks"
}
}))
// 设置session
app.use(session({
maxAge: 3000
}, app));
// 首页路由
// ctx:上下文对象
router.get("/", async (ctx) => {
await ctx.render("index.html")
})
// 登录页:任何用户都可以访问
// get请求
router.get("/login", async (ctx) => {
await ctx.render("login.html")
})
// post请求
router.post("/login", async ctx => {
let username = ctx.request.body.username;
let password = ctx.request.body.password;
if (username === "xiaoming" && password === "123456") {
ctx.session.user = "xiaoming"
// 重定向
ctx.redirect("/list");
} else {
ctx.redirect("/");
}
})
// 内容页
router.get("/list", async (ctx) => {
// session里面有user,就渲染list页面
if (ctx.session.user) {
await ctx.render("list.html");
} else {
ctx.redirect("/");
}
})
// 注销
router.get("/logout", async ctx =>{
// 清除session中的user值
ctx.session.user = "";
// 重定向到首页
ctx.redirect("/");
})
app.use(router.routes());
// 设置监听端口
app.listen(3000, () => {
console.log("server is running");
})
3、layout.html(模板页)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Layout</title>
</head>
<body>
<div>
<a href="/">首页</a>
<a href="/login">登录</a>
<a href="/list">列表</a>
</div>
{% block content %} {% endblock %}
</body>
</html>
4、login.html(登录页)
{% extends "./views/layout.html" %}
{% block content %}
<h1>登录</h1>
<form action="/login" method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" value="登录">
</form>
{% endblock %}
5、index.html(首页)
{% extends "./views/layout.html" %}
{% block content %}
<h1>首页</h1>
{% endblock %}
6、list.html(列表页)
{% extends "./views/layout.html" %}
{% block content %}
<h1>列表</h1>
<a href="/logout">注销</a>
{% endblock %}