【问题标题】:Chrome pre-fetch causes duplicate flash messageChrome 预取导致重复的 flash 消息
【发布时间】:2016-10-20 06:14:20
【问题描述】:

在我的 Symfony 3.0.6 应用程序中,某些常用路由在用户注册完成之前不可用。在这完成之前,我使用AccessDeniedHandlerInterface 将他们重定向到提示他们完成它的路线。我还用一条消息来解释发生了什么:

/**
 * Handles an access denied failure.
 *
 * @param Request $request
 * @param AccessDeniedException $accessDeniedException
 *
 * @return Response may return null
 */
public function handle(Request $request, AccessDeniedException $accessDeniedException)
{
    if (null === $token = $this->security->getToken()) {
        return;
    }

    if (!is_object($user = $token->getUser())) {
        return;
    }

    /** @var User $user */

    if (!$user->isFinalised()) {
        $request->getSession()->getFlashBag()->add('info', 'You need to complete your registration before you can do this!');
        return new RedirectResponse($this->router->generate('app_registration_complete'));
    }

    return;
}

但是,Chrome 的预取/预渲染服务会出现问题 - 如果 Chrome 确定某个 URL 可能会被访问​​,它会预取它。预取会导致上面的 flash 消息被添加到用户的会话中,因此 any 后续页面加载意味着会显示该消息。如果他们确实去了他们还不允许访问的路线,他们会看到两次消息 - 一次在预取期间生成,另一次在他们实际导航时生成。

this question 中描述了类似的问题,但在这种情况下,接受的答案(使用POST 进行注销请求)似乎并不是正确的解决方案。 flash 消息更多的是对GET 重定向的解释性补充,而不是改变应用程序状态的东西。此外,用户可能会通过多种方式到达这些不允许的路线之一,我将所有这些都转换为触发POST 以解决某些情况下的预取问题对我来说没有意义。

那么……我应该如何处理呢?

【问题讨论】:

    标签: php google-chrome symfony


    【解决方案1】:

    我发现您的代码存在一个问题。你应该改成这样:

    if (null === $this->security->getToken()) {
        return;
    }
    

    我认为这不会解决问题。

    【讨论】:

    • 嗨,Alvin,恐怕你搞错了 - = 运算符的优先级高于 ===。运行 var_dump(null === $a = null); 以查看它的实际效果。
    • 感谢亚历克斯指出这一点。你说的对。我从该代码中看到它也可能初始化变量 $token。我的错误 - 抱歉。
    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 2016-12-15
    • 2018-03-11
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    相关资源
    最近更新 更多