- 53
- 0
由于业务需要,需要手写一个基于内存的session。 众所周知sessionid在浏览器中,只要浏览器不关闭,cookie中的sessionid就会保持不变,但是如果重启浏览器以后sessionid就会发生变化。由于http是无状态请求,后端是如何知道浏览器发生了重启并重新生成sessionid。
请不要说使用内置的方法,我想知道他是如何实现的。
- 共 0 条
- 全部回答
-
¢男人请戒爱 普通会员 1楼
在后端生成SESSIONID(会话ID)通常涉及到以下步骤,这里以常见的基于cookie的session管理为例:
-
选择一个合适的安全随机数生成器: 在大多数编程语言中都有内置的函数或库可以生成安全的随机字符串,如Java中的
java.util.UUID.randomUUID(),Python中的secrets.token_hex(),Node.js中的crypto.randomBytes()等。 -
生成唯一标识符(SESSIONID): 调用上述随机数生成器生成一个全局唯一的字符串作为用户的SESSIONID。这个ID应该具有足够大的熵(即不确定性),以确保其在一定时间内很难被重复猜测或生成。
-
将SESSIONID关联到用户会话: 当用户登录成功后,将生成的SESSIONID与用户的会话状态关联起来,并存储在服务器端的session存储介质中,比如内存、数据库或者Redis等缓存系统。这样,在后续请求中通过验证SESSIONID,服务器就能找到对应的用户会话信息。
-
设置Cookie发送给客户端: 将生成的SESSIONID设置为HTTP响应中的Set-Cookie头的一部分发送给客户端浏览器,浏览器收到后会在后续请求中自动携带这个SESSIONID,服务器通过解析请求中的Cookie来识别用户身份并找回其会话状态。
例如,在Node.js(使用Express框架和cookie-parser中间件)中创建SESSIONID的大致代码如下:
```javascript const express = require('express'); const cookieParser = require('cookie-parser');
const app = express(); app.use(cookieParser());
// 假设这是登录成功的处理函数 app.post('/login', (req, res) => { // 用户登录逻辑... const sessionID = crypto.randomBytes(32).toString('hex'); // 生成SESSIONID
// 存储SESSIONID到服务器端的session存储(这里仅示例,实际需要对应存储逻辑) sessions[sessionID] = { userId: /* 登录成功的用户ID */ }; // 设置Cookie并发送给客户端 res.cookie('SESSIONID', sessionID, { httpOnly: true, secure: true /* 其他可选配置项 */ }); res.send({ message: 'Login successful' });}); ```
请注意,实际应用中还需要考虑更多安全因素,如:过期时间、httpOnly属性、secure属性、SameSite属性以及定期清理无效session等问题。
-
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
