【问题标题】:Why is session data lost after redirect in fuelPHP?为什么在fuelPHP中重定向后会话数据丢失?
【发布时间】:2014-02-11 16:29:47
【问题描述】:

我有一个奇怪的情况。考虑以下场景:

  1. 页面上的表单发布到另一个域
  2. 该域处理数据,并回发到控制器 A
  3. 控制器 A 处理返回的数据,并设置 Flash 会话变量
  4. 控制器 A 重定向到控制器 B
  5. 在控制器 A 中设置的会话值丢失。

现在,我注意到如果我消除第 4 步;会话值不会丢失。只有在调用 Response::redirect() 后才会发生。

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

$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() 方法中设置的任何会话数据都保持不变。

我对此感到非常困惑。知道为什么我的会话数据丢失了吗?

【问题讨论】:

  • 您是否正在重定向到另一个 cookie 不同的域?
  • 不(至少我不这么认为)。重定向到应用程序中的另一个控制器。

标签: php session redirect fuelphp


【解决方案1】:

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

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

当我看到这一点后,只需追踪那些推送所有我不需要的额外数据的代码并将其删除。

【讨论】:

    猜你喜欢
    • 2013-01-06
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 2017-09-11
    • 2012-08-17
    • 1970-01-01
    • 2021-08-24
    相关资源
    最近更新 更多