0

我知道这是一个常见问题,我之前遇到过并且能够解决它,但我无法解决这个问题,所以我需要一些额外的眼睛/大脑。

这是我在使用调试器时目睹的确切场景:

[home page load]
Session::Load()
$session_uid = (new) d149f...
$row = false

[login page load]
Session::Load()
$_COOKIE['x'] (found/existing) d149f...
$session_uid = d149f...
$row = data

$_COOKIE['x'] d149f...

[login page login submit] // <--- submitted via Ajax code above
Session::Load()
$_COOKIE['x'] == null // <--- Here's the problem
$session_uid = (new) 4bd87...
$row = false

$_COOKIE['x'] d149f... (original)
+
$_COOKIE['x'] 4bd87... (new created from ajax post)

如果我使用下面的 jQuery 使用 AJAX 提交登录表单,则服务器在处理帖子时看不到现有表单$_COOKIE['x'],这导致我们的会话处理程序无法识别访问者并创建一个新会话并将另一个会话添加$_COOKIE['x']到浏览器。

在不使用 AJAX 的情况下,服务器会正​​确读取浏览器$_COOKIE['x']并识别访问者。cookie 域和路径似乎是正确的,我也没有执行任何跨域请求。

$_COOKIE['x'] Domain: localhost Path: /myApp

在每个请求上运行的 PHP 代码如下。我已经运行了 xdebug 并逐步完成了请求,它确实在浏览器和 AJAX 请求上都正确地通过了代码,因此只有 AJAX 请求返回$_COOKIE['x']才会null创建一个新会话。

if ( empty( $_COOKIE['x'] ) ) { // new sess

登录表单 AJAX 代码:

$( '#btnLogin' ).on( "click", function() {
    console.debug( 'Click' );
    // Btn
    var btn = $( this );
    // Form data
    var frm = $( '#' + btn.val() );
    // Validate
    if ( !frm.valid() ) {
      return false;
    }
    btn.prop( 'disabled', true ).html( 'Please wait...' );
    var frmData = frm.serializeArray();

    // Ajax execute
    var go = $.ajax( {
      type: 'POST',
      url: '<?php echo CONTROLLER; ?>/ajax',
      dataType: 'json',
      data: frmData
    } ).done( function( results ) {
      console.debug( 'Done' );
      console.debug( results );
      // Handle Results
      if ( results['status'] === 'OK'
              && results['message']['status'] === 'active')
      {
        $( '#user_login_results' ).html( "<span class='alert alert-success'>Success! Click <a href='#' onClick='document.location.reload(true)'>here</a> to reload.</span><p></p>" );
        btn.html( 'Success!' );
<?php
$return = 'login';
if ( !empty( $_REQUEST[ 'return' ] ) ) {
  $return = htmlentities( $_REQUEST[ 'return' ] );
}
?>

        location.href = '<?php echo CONTROLLER; ?>/en/<?php echo $return; ?>';
      }
      else
      {
        console.debug( results );
        $( '#user_login_results' ).html( "<span class='alert alert-error'>Please check your username and passphrase and try again.</span><p></p>" );
        btn.prop( "disabled", false ).html( "Try Again &raquo;" );
      }
    } ).fail( function( msg ) {
      // Error results
      console.debug( msg );
      $( '#user_login_results' ).append( "<span class='alert alert-error'>Error! Please try again later.</span><p></p>" );
      btn.html( 'Error!' ).removeClass( 'btn-primary' ).addClass( 'btn-danger' );
    } ).always( function() {
      $( "body" ).scrollTop( $( "#result" ) );
    } );
  } );
4

1 回答 1

0

好的,所以我猜它setcookie毕竟是路径,将它从默认更改为“/”立即明确地解决了问题。

老的:setcookie( $cookie_name, $session_uid);

新的:setcookie( $cookie_name, $session_uid, time()+60*60, '/');

于 2013-08-31T17:18:04.987 回答