最近负责的系统总是出现奇怪的缓存问题,在这里简单记录一下碰到的问题和踩到的坑。

问题:用户反映使用不同账号A,B登录时,都出现账号A的页面信息(未邮寄账单提示)。如下所示:

图1:未邮寄账单提示

一  session缓存问题

鉴于之前也出现过类似的session缓存问题,session的key信息未清除。

如果A用户切换至B用户时,使用了不同的session key如‘U’,‘U_P’保存不同的信息,但是切换后只清除了'U'信息,忘记清除'U_P'信息,则可能导致A用户和B用户看到同样的‘U_P’信息。查看此处的代码也确实使用了seesion缓存:

图2:未邮寄账单session缓存

是不是这个原因引起的呢,之前的这个问题按说已经修复了,难道还有啥代码没改?查看代码,切换用户的时候移除了session的内容,登出账号的时候也失效掉了session信息。

图3:session清除

通过查看后台服务器日志,发现A用户登录后调用了/un-post-billls-GET链接,获取到了未邮寄账单信息。但是B用户的后台日志没有找到调用过后台的链接,所以排除了后台session缓存错误的可能。后台日志就不上图了,^_^。

二 浏览器本地缓存问题

由于B用户根本就没有调用后台服务,就拿到了未邮寄账单的信息,我们认为很大可能是浏览器本地缓存引起的问题。

1 Localstorage缓存

查看前端代码,在查询未邮寄账单信息时,使用了HTML5的window.localStorage来保存用户的信息,代码如下:

图4:localstorage缓存

并没有看到对localStorage的clear操作,这样可能是有问题的:A用户登录后在localstorage保存了未邮寄账单信息,切换至B用户后由于没有clear A用户的localstorage 信息。那么B用户就看到了A用户的本地缓存信息。

解决办法:在合适的时机清理localstorage,使用不同的key 保存缓存信息。

2 浏览器url缓存

这个bug是否就这样解决了呢?仔细看图4的localstorage代码,A用户和B用户实际上使用了不同的dataKey_A与dataKey_B来保存各自的localStorage,虽然说有一定的安全问题,但是由于不同的KEY存在,按道理说B用户不会看到A用户的未邮寄账单信息。问题可能不在localStorage这里。

根据 HTTP 规范,GET 用于信息获取,而且应该是幂等的。也就是说,当使用相同的URL重复GET请求会返回预期的相同结果。这个问题与现在的情况非常相似。

查看代码,使用了相同的URL请求重复GET:

图5:URL请求GET

解决办法:

1. GET请求URL后加随机数,让服务器认为不是相同的请求。

例 “/un-post-bills?t=” + new Date().getTime()

2. 使用POST代替GET,浏览器不会对POST做缓存

三 总结

WEB系统的缓存通常有好几级,本地缓存,服务器缓存,数据库缓存等。分析缓存问题时,要考虑每一层可能引起的问题,每一层的缓存技术也有很多种,要根据具体的场景来选择使用何种缓存技术。

缓存技术博大精深,本文只记录寻找bug时涉及的技术,其他有待学习。

html本地缓存未查看信息,不同用户看到了相同的信息-一次web系统缓存问题的解决...相关推荐

  1. 【安全资讯】“微信清粉”被爆非法获取用户信息,用户付费后,个人信息被出售

    作者|蔚可云 来源|今日头条 发布时间|2021-11-07 图片来源:51CTO.com 微信好友加满了,想删掉一些联系人,又怕删错好友.好友把你删了,可他还躺在你的好友列表里. 基于这个需求,催生 ...

  2. App信息保护合规审核(个人信息保护政策)

    APP信息保护合规审核 APP信息保护合规审核 用户信息收集.使用规则拨测 应用敏感权限过度申请拨测 APP侵权行为 APP信息保护合规审核判定规则细读 一.以下行为可被认定为"未公开收集使 ...

  3. web服务器缓存(二)

    通过(一),我们学会了配置Apache的cache模块,测试了静态文件的缓存,静态文件成功被web服务器"捕获",生成了缓存文件,但是我们更关心的是动态文件,因为它比静态文件更加消 ...

  4. git服务器查看用户信息,git 查看当前git用户_新Git用户使用方法

    git 查看当前git用户 This post is a tutorial for new users to set up git and clone and use the first reposi ...

  5. 我能查看Instagram 所有用户的私人邮件和生日信息

     聚焦源代码安全,网罗国内外最新资讯! 尼泊尔研究员 Saugat Pokharel 公开了自己近期发现的一个 Instagram 漏洞的详情.如下是正文: 10月22日,正当我查看一些安全/隐私问题 ...

  6. ORACLE查看当前连接用户的权限信息或者角色信息

    关于当前用户的相关信息,可以通过如下语句找到: 1 SQL> select * from all_objects where object_name like 'SESSION%'; 2 3 O ...

  7. Linux系统环境查看已经登录用户信息及管理

    Linux属于多用户系统,root账户可以去查看现在登录的用户信息及其操作: 1.查看某一时刻用户的行为 w ROOT@LOCALHOST ROOT] # W 2:31PM UP 11 DAY ,21 ...

  8. linux如何查看所有的用户和组信息?

    cat /etc/passwd cat /etc/passwd查看所有的用户信息,详情如下图   [步骤二]cat /etc/passwd|grep 用户名 cat /etc/passwd|grep ...

  9. Linux如何查看所有的用户和组信息

    linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号.在使用linux操作系统时候,通常我们会遇到对多用户进行管理. 比如: 用户账号的添加 ...

最新文章

  1. python读音有道词典-有道词典命令行快速翻译,Python编程的利器
  2. python基础教程:startswith()和endswith()的用法
  3. java 计时_Breitling(百年灵)世界时间终极计时腕表
  4. ugui源码_UGUI整体解决方案基础篇(Unity 2019)
  5. JEECG寒假集训班开始报名啦!
  6. Visual SVN的安装
  7. 12306 被质疑过度获取用户隐私;直播答题外挂横行;阿里云辟谣称绝不做虚拟货币 | 一周业界事
  8. 关于Oracle针对中文的md5加密
  9. dsoframer java_dsoframer控件动态加载
  10. 中兴盒子B860AV2.1-A-B-M-U,通刷,线刷刷机固件
  11. java的运行环境是什么_Java运行环境是什么
  12. 电脑32位和64位是什么
  13. CMS漏洞(发货100CMS、SHECMS、ZHCMS、MACCMS)详解实战
  14. css动画怎么暂停,纯CSS代码实现动画的暂停与播放
  15. 前端获取本地ip和外网ip
  16. 导出Excel:合并单元格
  17. C++:乱码之字符串编码
  18. 湘潭大学计算机组成原理试卷,湘潭大学 计算机组成与原理 控制器实验 实验报告...
  19. 谷歌浏览器打开是搜狗浏览器怎么办?
  20. 基于kinect v2的模型三维重建算法(个人毕设总结)

热门文章

  1. 电脑开启防火墙后ping不通 及 开启防火墙后,不能远程的解决办法
  2. Error running ‘Tomcat‘: Unable to open debugger port (127.0.0.1:2148): java.net.SocketExceptio
  3. JAVA WEB篇3——JSP
  4. java ssh 那一层应该捕获异常_ssh经典异常!
  5. java获取http状态码_java获取Json和http状态码
  6. realtek audio console无法连接rpc服务_RPC服务在游戏中的简单运用
  7. 线程被中断跟被阻塞有什么区别_宠物加盟店跟自营店有什么区别
  8. Android日志[进阶篇]四-获取错误报告
  9. 存储ic载板_延伸IC领域 崇达技术拟将持有普诺威55%股权
  10. 采用推理的方法认知单词、CBOW模型