2017-09-30 5 views
0

J'ai travaillé sur un projet qui me demande d'effectuer une redirection JS vers une page, en configurant une variable de session en PHP via une requête AJAX, puis en vérifiant que la session est réglé. Après une vérification réussie, l'URL de redirection serait alors construite dans JS et la redirection effectuée.Redirection JS après avoir défini une session var avec AJAX

Ce que j'ai à ce jour est:

<?php 

$v_ip = $_SERVER['REMOTE_ADDR']; 
$hash = md5($v_ip); 

?> 

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 

<script> 

$.ajax({ 
    type : 'POST', 
    url : './session.php', 
    dataType: "json", 
    data: "<?php echo $hash; ?>", 
    success : function(data){}, 
    error : function(){} 
}); 
</script> 

<script> 

<?php 

if(isset($_SESSION['allow'])) { 

echo "var url = \"url-here/?token=\"; 
     var token = \"token\"; 
     var redirect = url.concat(token);"; 

} 

?> 

window.location.replace(redirect); 

</script> 
</head> 

</html> 

Et le code PHP qui définit la variable:

<?php 

session_start(); 

$v_ip = $_SERVER['REMOTE_ADDR']; 
$hash = md5($v_ip); 

if(isset($_POST["$hash"])) { 

$_SESSION['allow'] = true; 

} 

?> 

Sur une première visite à la page, tout est traité correctement et de travaux jusqu'au point de la redirection réelle. La variable de session est définie, le code JS est correctement sorti dans le code de la page, et pour une raison étrange, la fonction window.location.replace réelle n'est pas activée. La page reste simplement vide - lors de l'inspection, le code source affiche tout correctement, et pourtant la redirection ne se produit pas. Si je visite la page une fois de plus, la redirection est bien faite. Si je change le nom de la variable de session dans les deux fichiers, et que je dois tout re-régler, la même chose se produit: lors de la visite initiale, la redirection n'est pas traitée, mais clairement jusqu'à la redirection réelle est traité correctement à nouveau.

Pourquoi cela se produit-il?

Répondre

0

La première fois que vous accédez à la page, la variable de session n'est pas encore définie. Donc le if échouera, et les assignations de variables ne seront pas mises dans le <script>. Le navigateur effectuera alors l'appel AJAX qui définit la variable de session, mais il est trop tard pour affecter cette page originale, vous devez retourner à la page pour voir l'effet de celle-ci. Rappelez-vous, tout le PHP dans la page est d'abord exécuté sur le serveur, la sortie est envoyée au navigateur, puis le JS est exécuté.

Je vous suggère de mettre le code qui effectue la redirection dans la fonction success: de $.ajax.

+0

C'est la chose - le si n'échoue pas - quand j'inspecte le code source de la page blanche, il montre le code JS conditionnel sorti correctement, ce qui signifie que la session var est définie. Il n'exécute tout simplement pas la redirection pour une raison quelconque. Toutes les variables utilisées pour la construction de l'URL de redirection sont définies correctement. – Mirian

+0

Utilisez-vous 'View Source'? Cela fait un autre GET de l'URL, donc c'est comme aller à la page une seconde fois. – Barmar

+0

Y a-t-il des erreurs dans la console Javascript? – Barmar

0

Je pense qu'il y a plusieurs choses à manipuler. Tout d'abord, php lui-même est un moteur de template. Qu'est-ce que ça veut dire? Cela signifie qu'il va traduire le script php en HTML aussi possible que possible. donc ce bloc ci-dessous sera traduit en html et restera statique.

<?php 

if(isset($_SESSION['allow'])) { 

    echo "var url = \"url-here/?token=\"; 
    var token = \"token\"; 
    var redirect = url.concat(token);"; 
} 
?> 

En d'autres termes, la variable de redirection est déterminée avant votre appel Ajax. Cela peut aussi expliquer pourquoi la deuxième fois que vous visitez la page le travail de redirection, mais pas la première fois. Deuxièmement, bien que vous placiez du code lié à Ajax avant window.location.replace, cela ne veut pas dire qu'ils vont tirer dans l'ordre désiré. C'est parce que l'appel Ajax est une opération asynchrone et vous ne pouvez pas prédire quand vous obtiendrez la réponse. Dans cette situation, je vais mettre la window.location.replace chose en appel rappel Ajax avec succès comme:

$.ajax({ 
    type : 'POST', 
    url : './session.php', 
    dataType: "json", 
    data: "<?php echo $hash; ?>", 
    success : function(data){ 
    window.location.replace(data.url) 
    }, 
    error : function(){} 
}); 

Troisièmement, vous devez détecter isset($_SESSION['allow']) chose côté serveur et la réponse dans un format semblable à JSON:

{ 
    url: desired_url 
} 

Espoir cette aide. Bonne chance.