如何避免浏览器缓存特定注销链接,而非禁用全站缓存?
解决注销链接被浏览器缓存的问题
刚好遇到过类似的场景,完全理解你不想禁用整页缓存但要确保注销请求每次都能触发服务器调用的需求。这里有几个靠谱的方案,你可以根据自己的技术栈选择:
改用POST请求(最推荐)
浏览器基本不会缓存POST请求,而且从语义上来说,注销是修改用户状态的操作,用POST比GET更符合REST规范。你可以把链接改成一个样式类似链接的表单:<form action="~/User/Logoff" method="post" style="display: inline; margin: 0;"> <button type="submit" style="border: none; background: transparent; color: #0066cc; text-decoration: underline; cursor: pointer;">Log off</button> </form>用户看起来和点击普通链接没区别,但每次点击都会触发POST请求,绝对不会被缓存。
给GET请求添加唯一参数
如果因为某些原因必须用GET,那可以给URL加一个动态的唯一参数(比如时间戳),让浏览器认为每次都是新请求。用JS就能轻松实现:<a href="~/User/Logoff" onclick="this.href += '?nocache=' + Date.now();">Log off</a>每次点击时,URL后面会带上
?nocache=1620000000000这类唯一值,浏览器就不会复用之前的缓存了。在服务器端给注销接口设置禁止缓存的响应头
直接在处理注销的后端代码里,给响应加上缓存禁止的头,这样即使浏览器想缓存,也会被服务器指令阻止。比如在ASP.NET中可以这么写:public ActionResult Logoff() { // 执行注销逻辑... // 设置禁止缓存的响应头 Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.Cache.SetNoStore(); Response.Cache.SetExpires(DateTime.UtcNow.AddSeconds(-1)); return RedirectToAction("Index", "Home"); }这样浏览器收到这个响应后,就不会缓存该请求的结果,下次点击注销链接时还是会发起新请求。
这几个方案都不用动整页的缓存设置,精准解决注销链接的缓存问题,你可以根据自己的实际情况选择~
内容的提问来源于stack exchange,提问作者cicatrix
相关产品推荐
相关产品推荐

