网站服务器程序可以在浏览器中写入cookie,然后浏览器再次访问这个网站时,就会带着这个cookie。
const router = require("koa-router")();
const Koa = require("koa");
const nunjucks = require("nunjucks");
const views = require("koa-views");
const app = new Koa();
app.use(views(__dirname + '/views', {
map: { html: 'nunjucks' }
}));
router.get("/", async ctx => {
ctx.cookies.set("username", "xiaoming");
ctx.body = "hello cookie";
})
app.use(router.routes())
app.listen(3000, () => {
console.log("server is running");
})
可以在chrome调试工具中的network选项卡查看cookie内容
写入cookie之后,这个浏览器再次访问这个网站的任何一个页面,都会带着这个cookie。
通过maxAge可以设置cookie过期的毫秒数,实例代码如下所示
ctx.cookies.set("username","xiaoming",{
maxAge:5000 //过期时间设置为五秒
})
获取cookie(cookie以key-value形式记录在客户端(浏览器))
router.get("/images", async ctx => {
let usr = ctx.cookies.get("username");
ctx.body = usr;
})
记录网页访问次数
利用cookie,可以记录客户端访问浏览器的次数,实例代码如下所示:
router.get("/count", async ctx => {
let count = ctx.cookies.get("count");
if (count > 0) {
count = ++count;
ctx.cookies.set("count", count, {
maxAge: 2000
});
} else {
count = 1;
ctx.cookies.set("count", 1);
}
ctx.body = count
})
利用cookie在客户端存储数据是完全透明的,如果存储一些用户信息,会导致很严重的安全问题,所以为了记录用户的登录状态,需要使用cookie与session结合的方式。
这个加密密钥就是我们给客户端的磁卡,这里随便设什么内容,但是一定要有。
要不然会 Error: .keys required for signed cookies
人家官方文档里面就有,你凭什么没有。
const session = require("koa-session");
//加密的密钥,服务器通过加密的cookie获取session
app.keys = ['secret'];
app.use(session({
maxAge:2000,
},app))
router.get("/session", async ctx => {
if(ctx.session.count>0){
ctx.session.count = ++ctx.session.count;
}else{
ctx.session.count = 1
}
ctx.body = ctx.session.count
})
给session设置一个count属性,可以直接通过赋值的方式
ctx.session.count = 0;
获取也可以使用相同的方法
let count = ctx.session.count
登录验证设计
首页:任何人都可以访问
登录页:提供表单,用户可以通过表单输入登录信息。
视频页:登录成功后可查看,并提供注销功能。
const router = require("koa-router")();
const Koa = require("koa");
const nunjucks = require("nunjucks");
const views = require("koa-views");
const session = require("koa-session")
const parser = require("koa-parser")
const app = new Koa();
app.use(parser());
app.keys = ["123456"]
app.use(session({
maxAge: 3 * 1000
}, app))
app.use(views(__dirname + '/views', {
map: { html: 'nunjucks' }
}));
//首页 任何人都可以访问
router.get("/", async ctx => {
await ctx.render("home.html")
})
//登录页 任何
router.get("/login", async ctx => {
await ctx.render("login.html")
})
//内容页 登陆后访问
router.get("/list", async ctx => {
if (ctx.session.user) {
await ctx.render("list.html")
} else {
ctx.redirect("/")
}
})
router.post("/login", async ctx => {
let username = ctx.request.body.username;
let password = ctx.request.body.password;
if (username === "admin" && password === "123456") {
ctx.session.user = "admin"
//重定向
ctx.redirect("list")
} else {
ctx.redirect("/")
}
})
router.get("/logout", async ctx => {
ctx.session.user = "";
ctx.redirect("/")
})
app.use(router.routes())
app.listen(3000, () => {
console.log("server is running");
})
学习视频:
https://www.bilibili.com/video/BV1zf4y1r711?p=9&share_source=copy_web