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 に答える