【问题标题】:gotoSimple() seems to reload to current action before redirectinggotoSimple() 似乎在重定向之前重新加载到当前操作
【发布时间】:2011-12-15 18:44:15
【问题描述】:

不知何故,当我在以下设置中使用gotoSimple 时,我的数据将被$object->save()secondAction() 中保存两次。

public function firstAction(){
    // get data

    // process postdata, if any

    if( $form->isValid( $postdata ) ) {
        $this->_helper->getHelper( 'Redirector' )->gotoSimple( 'second' );
    }

}

public function secondAction(){

    // get data

    // process postdata, if any

    if( $form->isValid( $postdata ) ) {
        if( $object->save( $postdata ) ) {
            // set flashmessage
            $this->_helper->getHelper( 'Redirector' )->gotoSimple( 'index' );
        }
    }

}

经过数小时的调试,我得出的结论是,secondAction() 中的 gotoSimple() 命令会在重定向到 indexAction() 之前触发 secondAction()。我已经确定indexAction() 不可能重定向回secondAction()

更有趣的是:这只发生在 IE7 和 IE8 中。谁能指出我这个奇怪行为可能来自哪里以及我该如何解决这个问题?

更新 通过在 gotoSimple() 命令之前的 secondAction() 中使用以下代码行,我可以 100% 确定当我按下提交按钮时,secondAction() 被调用了两次:

if( isset( $_SESSION['xyz-zyx'] ) ) {
    $this->_helper->getHelper( 'flashMessenger' )->addMessage( 'I\'ve already been here!' );
    unset( $_SESSION['xyz-zyx'] );
}
$_SESSION['xyz-zyx'] = true;

有什么想法吗?

【问题讨论】:

  • 刚刚检查过,但是设置重定向器的代码并没有改变任何东西。
  • 您是否使用执行重定向的重写规则?并且在重定向之后,$_POST 数据应该不再可用...
  • 是的,我正在使用重写规则,但我在这里不依赖 $_POST,当我离开 firstAction() 时,我将数据存储在会话对象中,并且在 secondAction() 中可用.您可以将此设置视为一个非常简单的向导。问题是,我可以在保存后取消设置会话对象,但这将在控制器代码第二次被重定向激活时触发错误。解决此问题的一种可能方法是检查 $_POST 参数,但是仍然会第二次激活代码...数据不会被保存两次,也不会出现错误...但仍然如此。 .
  • 如果有重定向并且您依赖会话数据,我认为除了将您的数据标记为已处理以避免两次保存数据之外,没有其他方法。我认为 gotoSimple() 不太可能执行两个重定向...

标签: php zend-framework session internet-explorer-8 internet-explorer-7


【解决方案1】:

检查您的服务器日志或监控您的网络,您将看到浏览器在实际重定向之前两次发送相同的请求。

我在浏览器中看到了许多发送请求两次的行为。有几个原因,但还有附加组件会触发第二个请求与您的应用程序混淆。在一种情况下,它很简单,例如缺少 favicon.ico 或图像文件的链接损坏。这一切都很好,在您开始处理会话状态或表单提交之前不会打扰您。

一旦您知道是什么触发了第二个请求,您不仅应该修复它,还应该添加额外的措施来防止来自任何浏览器的第二个请求。

【讨论】:

    【解决方案2】:

    问题似乎是由使用 Zend_DataGrid (BvBGrid) 引起的。重写了整个动作并修复了问题:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多