jQuery: richieste AJAX sullo stesso documento

Short link

jQuery può dialogare con qualsiasi linguaggio lato server tramite AJAX. In PHP, jQuery può anche leggere il cookie di sessione generato automaticamente quando viene chiamata la funzione session_start(). C'è di più: tramite AJAX possiamo reinviare il token di sessione allo script PHP che lo ha generato e riceverlo nuovamente codificato stavolta in MD5. Si tratta di una pratica discutibile a livello di sicurezza, ma molto interessante se la si vede sotto l'aspetto di chiamate AJAX sulla stessa pagina.

Creiamo un documento PHP che dovrà processare due parametri GET: ajax e token. Il primo indicherà che si tratta di una richiesta AJAX e il secondo conterrà il token estratto dal cookie di sessione (per intederci, il cookie che inizia con la stringa PHPSESSID=). All'inizio del documento inseriremo questo codice:


<?php session_start();
$token = $_GET['token'];
$md5 = md5($token);

if(isset($_GET['ajax'])) {

	echo '<ul><li>Token: ' . $token . 
	      '</li><li>MD5: ' . $md5 . '</li></ul>';
	      
	exit();

}
?>

Usiamo exit() per evitare di visualizzare due volte il contenuto HTML del documento. All'interno dell'elemento body useremo quindi il seguente codice jQuery:


$(function() {

	var cookie = document.cookie;
	var sanitizedCookie = cookie.replace(/[A-Z]+/g, '').replace('=', '');
	
	$('#view').click(function(event) {
	
		$.ajax({
			url: location.href,
			type: 'GET',
			data: 'ajax=true&token=' + sanitizedCookie,
			success: function(text) {
			
				$(text).insertAfter('body > p');
			
			}
		});
	
		event.preventDefault();
	});
});

jQuery legge il cookie di sessione, ne estrae il token e lo reinvia a PHP che restituirà il seguente output:

I due token visualizzati

Per motivi di sicurezza ho preferito evitare di fornire un esempio live. Abbiamo visto un aspetto molto importante: la capacità di utilizzare il documento corrente per l'elaborazione di una richiesta AJAX. Ovviamente se usate un framework PHP (per esempio Zend) l'elaborazione AJAX sarà molto più elegante e non ci sarà nemmeno bisogno di usare un parametro GET apposito.