11月09, 2017

koa-session记录

之前一直没尝试过session这一块操作,这次刚好有一次实践的机会。

其实比较简单,session一般是用在用户登录,维持会话这一块。

所以先要有一个登录页面。

// 使用koa-view
const views = require('koa-views');
app.use(views(__dirname + '/views', {
    map: {
        html: 'nunjucks'
    }
}));

// ...

// 在views下面新建一个login.html,通过render就可以渲染到该页面
router.get('/login', async (ctx, next) => {
    await ctx.render("login");
});

alt

然后只要前端发请求即可。在发请求之前,后台先要配置一下session。

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

app.keys = ['some secret hurr'];  // 这个keys必须要有

const CONFIG = {
    key: 'SESSION', /** (string) cookie key (default is koa:sess) */
    /** (number || 'session') maxAge in ms (default is 1 days) */
    /** 'session' will result in a cookie that expires when session/browser is closed */
    /** Warning: If a session cookie is stolen, this cookie will never expire */
    maxAge: 86400000,
    overwrite: true, /** (boolean) can overwrite or not (default true) */
    httpOnly: true, /** (boolean) httpOnly or not (default true) */
    signed: true, /** (boolean) signed or not (default true) */
    rolling: false, /** (boolean) Force a session identifier cookie to be set on every response. The expiration is reset to the original maxAge, resetting the expiration countdown. default is false **/
};

app.use(session(CONFIG, app));
router.post("/api/login", async (ctx, next) => {
    ctx.session.username = "zpu"
    ctx.body = {"success": true};
})

在做完之后,前端只要发请求即可:

(function() {
    var obtn = document.getElementById("submit");
    obtn.onclick = function(ev) {
        fetch("/api/login", {
            credentials: "include",
            method: "post",
            headers: {
                "Content-Type": "application/json"
            },
            body: JSON.stringify({a: 1, b: 2})
        }).then(function(response) {
            return response.json();
        }).then(function(data) {
            console.log(data);
        }).catch(function(e) {
            console.log("出错了");
        });
        ev.preventDefault();
    }
})();

完成请求后,就可以在cookie面板中看到:

alt

同时其他的ajax操作,带上当前页面的cookie后,就可以在ctx上下中取到username:

console.log(ctx.session.username);  // zpu

如果手动把cookie清空,那么上面的值将变成undefined。

当然这个session只是内存中的,如果部署多台机器,那么需要将session放到redis中。这一块可以参考 koa2 web应用进阶-session

希望以后能有redis的实践机会。。

本文链接:www.my-fe.pub/post/koa-session.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。