为什么在fuelPHP中重定向后会话数据丢失了?

时间:2014-02-11 16:29:47

标签: php session redirect fuelphp

我有一个奇怪的情况。请考虑以下情形:

  1. 表单在页面上发布到另一个域
  2. 该域处理数据,并回发到控制器A
  3. controller A处理返回的数据,并设置flash会话变量
  4. controller A重定向到控制器B
  5. 控制器A中设置的会话值丢失。
  6. 现在,我注意到如果我取消第4步;会话值不会丢失。它只在调用Response :: redirect()后发生。

    以下是控制器A的后处理程序中的相关代码(在这种情况下,$ vars设置为Input :: post();而renew()方法对另一个API执行soap调用,并返回响应数据。):

    $success_object = $this->renew( $vars );
    $persist_through_redirect = array(
        'accountId' => $success_object->account->accountId,
        'expireDate' => $success_object->account->expireDate,
        'createDate' => $success_object->account->createDate,
        'due_amount' => $success_object->account->lastPaymentAmt,
        'offer_name' => $offer_name,
        'member_name' => $vars['first_name'] . ' ' . $vars['last_name']
    );
    return $this->redirect('success/', $persist_through_redirect);
    

    这是方法redirect()背后的代码:

    private function redirect($redirect_endpoint, $redirect_values = null) { 
        Session::set_flash('flash_redirect', $redirect_values);
        Response::redirect($redirect_endpoint);
    }
    

    最后,这是控制器B中访问会话数据的代码:

    $information = Session::get_flash('flash_redirect');
    if(isset($information)) {
        View::set_global('membership',  $information);
    }
    // set the locale based on fuel's setting
    View::set_global('locale', str_replace( '_', '-', Fuel::$locale ));
    return View::forge('successes/success_card');
    
    但是,它变得更加怪异。并非所有会话数据都丢失。我在before()方法中设置的任何会话数据都保持不变。

    我对这个非常难过。我的会话数据丢失的任何想法?

1 个答案:

答案 0 :(得分:0)

事实证明,核心问题是我的会话cookie超过4kb。

发生的事情是,当我调用Response :: redirect()时,脚本在该点结束,但也导致重定向隐藏了抛出的异常。我在重定向之前添加了对Session :: write()的调用,这使得异常不会因页面重新加载而被“隐藏”。

一旦我看到这一点,只需要跟踪代码,这些代码正在推送我不需要的所有额外数据,并将其删除。