cookie与session

cookie

用户到商店买东西,商店出了个想法,给用户张会员卡,会员卡有两种方案
一种是上面的,一张卡能用10次折扣,每用一次次数-1。
但有个弊端,会员卡的次数记录在卡上,卡在用户里,要是用户用某些方法改了会员卡的次数就能无限刷
另一种是下面的,会员卡只记录个人信息,商店读取卡里的个人信息来获取折扣次数,并在商店的电脑改变次数,显然更安全

cookie就会服务器发给客户端的一个凭证,如商店给用户发会员卡,而商店通过session来对应cookie以此找到用户信息
cookie是写在客户端上的数据,session是记录在服务器上的数据

设置cookie

const Koa = require("koa");//引入koa构造函数
const app = new Koa();//创建应用
const views = require("koa-views");//引入koa-views
const nunjucks = require("nunjucks");//引入nunjucks引擎
const router = require("koa-router")();

app.use(views(__dirname + "/views",{
    map:{html:"nunjucks"}
}))



router.get("/",async ctx => {
    //cookie是以明值对(类似于对象的键值对)的方式记录在客户端(浏览器)的
    ctx.cookies.set("user","admin");//设置cookie 属性名是user,值是admin
    ctx.body = "cookie";
})

app.use(router.routes());

app.listen(3000,() => {
    console.log("server is running");
});

获取cookie

const Koa = require("koa");//引入koa构造函数
const app = new Koa();//创建应用
const views = require("koa-views");//引入koa-views
const nunjucks = require("nunjucks");//引入nunjucks引擎
const router = require("koa-router")();

app.use(views(__dirname + "/views",{
    map:{html:"nunjucks"}
}))



router.get("/",async ctx => {
    //cookie是以明值对(类似于对象的键值对)的方式记录在客户端(浏览器)的
    ctx.cookies.set("user","admin");//设置cookie 属性名是user,值是admin
    ctx.body = "cookie";
})

router.get("/test",async ctx => {
    let user = ctx.cookies.get("user");//获取相应字段的cookie
    ctx.body = user;
})

app.use(router.routes());

app.listen(3000,() => {
    console.log("server is running");
});

页面显示admin,说明成功拿到了cookie的值

记录网页访问次数

const Koa = require("koa");//引入koa构造函数
const app = new Koa();//创建应用
const views = require("koa-views");//引入koa-views
const nunjucks = require("nunjucks");//引入nunjucks引擎
const router = require("koa-router")();

app.use(views(__dirname + "/views",{
    map:{html:"nunjucks"}
}))



router.get("/",async ctx => {
    //cookie是以明值对(类似于对象的键值对)的方式记录在客户端(浏览器)的
    ctx.cookies.set("user","admin");//设置cookie 属性名是user,值是admin
    ctx.body = "cookie";
})

router.get("/test",async ctx => {
    let count = ctx.cookies.get("count");//获取cookie,但页面第一次加载是获取不到cookie的,要刷新一次才行
    if(count > 0){//判断是否有cookie
        count = ++count;
        ctx.cookies.set("count",count,{
            maxAge:5000//设置cookie过期时间为5s,5s内没有刷新页面cookie就会失效
        });
    }else{
        count = 1;
        ctx.cookies.set("count",1);
    }
    ctx.body = count;
})


app.use(router.routes());

app.listen(3000,() => {
    console.log("server is running");
});




5s后失效

session

const session = require("koa-session");

app.keys = ["123456"];//记录在会员磁卡上的秘钥
app.use(session({
    maxAge:10000//如果时间太短就访问不了/session_test
},app))

router.get("/session",async ctx => {
    ctx.session.user = "admin";//设置session
    ctx.body = "set session";
})

router.get("/session_test",async ctx => {
    let user = ctx.session.user;//获取session
    ctx.body = user;
})

记录网页访问次数

const Koa = require("koa");//引入koa构造函数
const app = new Koa();//创建应用
const views = require("koa-views");//引入koa-views
const nunjucks = require("nunjucks");//引入nunjucks引擎
const router = require("koa-router")();
const session = require("koa-session");

app.keys = ["123456"];//记录在会员磁卡上的秘钥
app.use(session({
    maxAge:10000//如果时间太短就访问不了/session_test
},app))

app.use(views(__dirname + "/views",{
    map:{html:"nunjucks"}
}))

router.get("/session",async ctx => {
    ctx.session.user = "admin";//设置session
    ctx.body = "set session";
})

router.get("/session_test",async ctx => {
    if(ctx.session.count > 0){
        ++ctx.session.count;
    }else{
        ctx.session.count = 1;
    }
    ctx.body = ctx.session.count;
})

app.use(router.routes());

app.listen(3000,() => {
    console.log("server is running");
});

登录验证

server.js

const Koa = require("koa");//引入koa构造函数
const app = new Koa();//创建应用
const views = require("koa-views");//引入koa-views
const nunjucks = require("nunjucks");//引入nunjucks引擎
const router = require("koa-router")();
const session = require("koa-session");
const parser = require("koa-parser");//处理post请求

app.use(parser());

app.keys = ["123456"];//记录在会员磁卡上的秘钥
app.use(session({
    maxAge:30*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){//list不是随便都能访问的,必须要有session且session要有user属性
        await ctx.render("list.html");
    }else{
        ctx.redirect("/");
    }
})
//登出
router.get("/logout",async ctx => {
    ctx.session.user = "";//设置session的user属性为空
    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";//登录成功要设置一个session
        ctx.redirect("/list");//重定向:跳转到其他页面
    }else{
        ctx.redirect("/");//登录失败就跳转到首页
    }
})
//完整应该是先拿cookie保存的session id让服务器查找对应的session信息,再执行登录

app.use(router.routes());

app.listen(3000,() => {
    console.log("server is running");
});

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>Document</title>
</head>
<body>
    <div>
        <a href="/">首页</a>
        <a href="/list">列表</a>
        <a href="/login">登录</a>
    </div>
    {% block content %} {% endblock %}
    
</body>
</html>

home.html

{% extends "./views/layout.html" %}

{% block content %}

<h1>首页</h1>

{% endblock %}

list.html

{% extends "./views/layout.html" %}

{% block content %}

<h1>列表</h1>
<a href="/logout">注销</a>

{% endblock %}

login.html

{% extends "./views/layout.html" %}

{% block content %}

<form action="/login" method="post">
    <input type="text" name="username" placeholder="用户名">
    <input type="password" name="password" placeholder="密码">
    <input type="submit" value="登录">
</form>

{% endblock %}


posted @ 2022-11-18 23:02  ben10044  阅读(16)  评论(0编辑  收藏  举报