Cookie与Session

本文详细介绍了Koa框架中Cookie和Session的使用,包括设置、获取Cookie,利用Cookie实现登录计数,以及Session的管理与登录验证过程。通过实例展示了如何在前后端交互中保持用户状态和安全性。
摘要由CSDN通过智能技术生成

一、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 %}

7、效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pro1822

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值