【问题标题】:Laravel session bug?Laravel 会话错误?
【发布时间】:2020-05-30 00:28:56
【问题描述】:

为什么即使我忘记了一个会话,当我按下返回按钮时它仍然会打印它的值? 这是 laravel 中的错误还是我的代码有问题?

这就是我忘记会话的方式

session()->forget('user_role');
session()->forget('user_id');

但即使我这样做了,当我按下后退按钮时,它仍然会在控制台中打印值。 我已经尝试过其他方法,例如 pull 方法和重新分配新值,但问题仍然存在。

【问题讨论】:

  • 如果你刷新它会更新到预期值吗?会不会是本地缓存问题?
  • 因为会话存储在 cookie 中,并且该 cookie 被缓存。
  • @Joe cookie 只存储会话 id,不存储任何实际值。
  • @DanLewis 刷新后更新为预期值。
  • @Joe “缓存的 cookie”到底是什么意思?

标签: php laravel laravel-session


【解决方案1】:

session()->forget('user_role') 表现良好。但是,您仍然可以查看/打印,因为浏览器已经缓存了该页面,而不是进行网络调用,请求只是加热缓存。

要识别和禁用缓存一段时间,打开开发工具并在开发工具打开时禁用缓存并刷新页面。之后,您将无法再看到存储在会话密钥中的数据。供您参考,您看到的页面是浏览器缓存的页面。 如果您想检查是否正在清洗的值,这是临时解决方案。但是,如果您不希望您的用户有这种行为,您可以尝试给定的解决方案。

对于基于浏览器的缓存控制,您应该尝试使用给定的页面响应设置Cache-ControlPragmaExpires 标头,

$contents = View::make('viewname');
return response($contents)-> withHeaders([
    'Cache-Control' => 'no-cache, no-store, must-revalidate',
    'Pragma' => 'no-cache',
    'Expires' => 0
]);

这将允许您控制在浏览器中缓存的页面。将Expires 设置为 0 意味着该页面永远不会被缓存。您可以参考这里的Official MDN Docs

如果问题仍然存在或其他解决方案无法提供令人满意的结果,您也应该尝试disabling the Laravel blade view cache

【讨论】:

  • 这显然不是一个永久的解决方案,因为你不能要求你的用户在开发工具打开的情况下运行......
  • 有什么办法可以阻止浏览器缓存页面的显示?而且当我按回时它不会再次调用我的控制器吗?我只是习惯了 asp.net mvc,如果你按下后退按钮,它会调用你再次使用过的控制器并验证会话。
  • 这不是一个永久的解决方案,但如果我们正在开发它,我们必须禁用它。否则,没有解决方法。浏览器每次都会缓存页面。
  • @Kabergrammer 查看更新的答案,禁用视图缓存。如果问题仍然存在,请发表评论。
  • 禁用 internal 缓存无济于事。您需要设置适当的 HTTP 标头,以防止浏览器缓存页面。
猜你喜欢
  • 2011-11-02
  • 2014-07-07
  • 1970-01-01
  • 2017-05-18
  • 2017-06-26
  • 1970-01-01
  • 1970-01-01
  • 2017-09-22
  • 2018-02-04
相关资源
最近更新 更多