これは一般的な問題であることはわかっています。以前に遭遇したことがあり、修正できましたが、これを理解できないため、追加の目/頭脳のセットが必要です。
デバッガーでステップスルーしているときに目撃した正確なシナリオは次のとおりです。
[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 »" );
}
} ).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" ) );
} );
} );