请问登出这样写可以吗?

来源:10-12 开发路由

arden82

2020-09-08

//logout 放在routes/blog.js
router.get("/logout", (req, res, next) => {
    //刪除session,同時在req.session中被移除,但是在下一次請求的時候又會被建立
    req.session.destroy();
    res.json(new SuccessModel())
   
})

---------------------------------------------------------------------

//html-test 登出
const $btnDel = $("#logout")
$btnDel.click(function () {
   get("/api/blog/logout").then(res => {
       if (res.errno !== 0) {
           alert('登出失败')
           return
       }
       alert('登出成功')
       location.href = "/index.html"
   })
})


写回答

2回答

arden82

提问者

2020-09-09

使用req.session.destroy()

127.0.0.1:6379> keys *
1) "sess:wKZbEQ7o-DrbxyAkMaKMcA42Dr7nlD55"
127.0.0.1:6379> get sess:wKZbEQ7o-DrbxyAkMaKMcA42Dr7nlD55
"{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2020-09-10T14:24:36.296Z\",\"httpOnly\":true,\"path\":\"/\"},\"username\":\"arden\",\"realname\":\"\xe7\x87\x81\xe7\x87\x81\"}"
127.0.0.1:6379> keys *
//登出后
//存在redis裡面的原本key被刪掉了,又建立一個一個新的key
1) "sess:0t6krtPISdTZE5LIxsJD7pPIjuqmML-a"
127.0.0.1:6379> get sess:0t6krtPISdTZE5LIxsJD7pPIjuqmML-a
"{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2020-09-10T14:25:18.506Z\",\"httpOnly\":true,\"path\":\"/\"}}"
127.0.0.1:6379>

想问删除session数据?是使用res.clearCookie("connect.sid")吗?

127.0.0.1:6379> get sess:O36CjQ8QWwB9lP1eOyEIzUfjRzHdkL02
"{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2020-09-10T14:34:12.410Z\",\"httpOnly\":true,\"path\":\"/\"}}"
//登入后
127.0.0.1:6379> get sess:O36CjQ8QWwB9lP1eOyEIzUfjRzHdkL02
"{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2020-09-10T14:35:52.981Z\",\"httpOnly\":true,\"path\":\"/\"},\"username\":\"arden\",\"realname\":\"\xe7\x87\x81\xe7\x87\x81\"}"
//登出后,原本的key還在,又新增一個key
127.0.0.1:6379> keys *
1) "sess:NzPMO53A83lgXVHtN5BBmr4jeXXLefWK"
2) "sess:O36CjQ8QWwB9lP1eOyEIzUfjRzHdkL02"
127.0.0.1:6379> get sess:O36CjQ8QWwB9lP1eOyEIzUfjRzHdkL02
"{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2020-09-10T14:35:52.981Z\",\"httpOnly\":true,\"path\":\"/\"},\"username\":\"arden\",\"realname\":\"\xe7\x87\x81\xe7\x87\x81\"}"
127.0.0.1:6379> get sess:NzPMO53A83lgXVHtN5BBmr4jeXXLefWK
"{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2020-09-10T14:36:22.391Z\",\"httpOnly\":true,\"path\":\"/\"}}"
127.0.0.1:6379>

虽然旧的key不会被删掉,但采用redis过期删除旧的key,请问是这样的做法吗?

查到资料上是写res.clearCookie()只会删除cookie,并且如果您能以某种方式还原cookie(如果有备份或有人偷了它),则将重新登录(或cookie的任何功能)。

使用req.session.destroy() ,则会话也会在服务器中无效,因此,即使您获得了cookie,也不会获得该会话。


0
0

双越

2020-09-09

只删除 session 数据即可。

至于 req.session ,不用管。因为你本次请求之后 req 会销毁,下次请求会创建新的 req ,所以不用管。

0
3
arden82
回复
双越
不好意思老师,我还是有点不了解为何不用req.session.destroy()作为登出使用,在登出时,cookie会被删除和redis也会删掉原本session。但是如果是res.clearCookie("connect.sid"),当登出时,旧的session还在redis里面,需要自己设定删除。那为何不一开始就使用req.session.destroy()
2020-09-10
共3条回复

Node.js+Express+Koa2+Nest.js 开发服务端

从入门到实战,一站式掌握 Node.js+Express+Koa2

4051 学习 · 2006 问题

查看课程