一个session id覆盖的小问题
新项目线上部署,查看日志时,看到一个空指针异常。然后看到异常位置,跑到gitlab上搜到这个代码查看:
HttpSession session = request.getSession(false);
if (session == null ||
!(session.getAttribute(Constants.VERCODE).equals(verCode))) {
.....
这是把验证码放到session里了,然后从session里获取进行验证。但业务开发人员没考虑获取不到验证码的场景,然后……空指针了。
一个小问题,但为什么会这里获取不到验证码,为什么没有测试出来?
看完代码,继续看了下日志,获取验证码接口与登录接口的sessionId不一致。我们sessionId是存放在cookie里的,前端没做任何操作。
打开网站试了下登录,触发了这个空指针异常。。。但再次登录就正常,有点意思了。
然后看了下前端请求调用,发现了端倪。
会话正常流程是,前端初次请求后台接口,cookie里没有sessionId,后台初始化一个,并存放到cookie里返回。前端第二次请求的时候,携带这个cookie中的sessionId进行访问。
抓请求的时候发现,初次打开页面时,前端发起了两次后台请求。一个请求是获取验证码,另一个请求是查询一些公告信息。
两个接口都是以没有sessionId的状态进行请求,所以后台为两个接口都初始了session,不同的sessionId,验证码接口先返回,信息查询接口后返回,覆盖了浏览器cookie中的值。
这次,要不是后台开发的不严谨,估计只会以为自己是验证码输入错误而已……没料到这是一个必现的BUG。
作者:coderzl
出处:https://www.cnblogs.com/coderzl/
本文采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
标签:
bug
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次 .NET某云HIS系统 CPU爆高分析
· 如果单表数据量大,只能考虑分库分表吗?
· 一文彻底搞懂 MCP:AI 大模型的标准化工具箱
· 电商平台中订单未支付过期如何实现自动关单?
· 用 .NET NativeAOT 构建完全 distroless 的静态链接应用
· 如果单表数据量大,只能考虑分库分表吗?
· 一款让 Everything 更加如虎添翼的 .NET 开源辅助工具!
· (原创)[开源][.Net Framework 4.5] SimpleMVVM(极简MVVM框架)更
· 冲压车间软件实施
· 干货分享!MCP 实现原理,小白也能看懂