Ricapitolando:
1. La pagina che risponde alla richiesta AJAX deve ritornare un 401 se la sessione e' scaduta. Puoi postare il codice di questa pagina cosi' vediamo un po' perche' non ritorna un 401 in questo caso? Se non ho capito male hai detto che lo status code e' invece 200.
2. Quando la richiesta risulta in un 401 allora cambia la location con la pagina di login:
codice:$.ajax({ ... error: function(xhr, desc, err) { if (xhr.status === 401) { location.href = "/pagina-di-login"; } else { // Per es. 422 nel caso di validazione del form fallita // in questo caso visualizzare messaggi di errore etc. }; } });
3. Potresti anche fare in modo che cio' accada per tutte le richieste AJAX con qualcosa del genere:
codice:$(document).ajaxError(function(event, xhr, settings, exception) { if (xhr.status === 401) { location.href = "/pagina-di-login"; }; });
Abbi pazienza, vuoi vedere il codice della pagina in php che controlla la sessione?
<?php
$minutes=5;//Setta logout in minuti
if (isset($_SESSION["time"])) {
$sessionTTL = time() - $_SESSION["time"];
if ($sessionTTL > $minutes*60) {
session_unset();
session_destroy();
header("location:index.php");//redirect user to a login page or any page to which we want to redirect.
}
}else {
session_unset();
session_destroy();
header("location:index.php");//redirect user to a login page or any page to which we want to redirect.
}
$_SESSION["time"] = time();
?>
Questo codice viene incluso in tutte le pagine che richiedono autenticazione, giusto?
Se si' penso il problema sia in questa linea, che ti fa il redirect server side anche per la AJAX request.
Invece nel caso di AJAX requests non dovrebbe fare il redirect server side ma ritornare un 401:codice:header("location:index.php");
In questo modo puoi poi controllare, col JavaScript che ho scritto prima, che lo status code e' 401 e cosi' puo' fare il redirect client side quando la sessione e' scaduta, altrimenti procede come al solito.codice:header("HTTP/1.1 401 Unauthorized");
Quindi le cose da fare sono semplicemente due:
1. Far si' che tutte le AJAX requests abbiano un custom header che il PHP puo' poi controllare per sapere appunto se una richiesta e' AJAX:
(Questo e' soltanto un modo di farlo)codice:$.ajaxSetup({ beforeSend: function(xhr) { xhr.setRequestHeader('HTTP_X_REQUESTED_WITH_AJAX', 'true'); } });
2. Nel PHP controllare se la richiesta e' AJAX. In caso affermativo ritornare un 401 altrimenti fare il redirect alla pagina di login server side:
codice:<?php $minutes = 5; //Setta logout in minuti if (isset($_SESSION["time"])) { $sessionTTL = time() - $_SESSION["time"]; if ($sessionTTL > $minutes * 60) { session_unset(); session_destroy(); if (isset($_SERVER['http_x_requested_with_ajax']) && !empty($_SERVER['http_x_requested_with_ajax']) && strtolower($_SERVER['http_x_requested_with_ajax']) == 'true') { header("HTTP/1.1 401 Unauthorized"); } else { header("location:index.php"); //redirect user to a login page or any page to which we want to redirect. } } } else { session_unset(); session_destroy(); if (isset($_SERVER['http_x_requested_with_ajax']) && !empty($_SERVER['http_x_requested_with_ajax']) && strtolower($_SERVER['http_x_requested_with_ajax']) == 'true') { header("HTTP/1.1 401 Unauthorized"); } else { header("location:index.php"); //redirect user to a login page or any page to which we want to redirect. } } $_SESSION["time"] = time(); ?>
Ovviamente potresti rimuovere duplicazione.
Adesso il PHP sa' quando si tratta di una AJAX request e in tal caso ritorna il famoso 401 che ti serve. Chiaro?
Scusa ho fatto come segue, ma credo non sia corretto.
codice:<script type="text/javascript"> $(document).on("submit", "form", function(event){ event.preventDefault(); $('#ShowData').html('<img src="img/loader.gif" height="16" width="16"/>'); $.ajaxSetup({ beforeSend: function(xhr) { xhr.setRequestHeader('HTTP_X_REQUESTED_WITH_AJAX', 'true'); } }); $.ajax({ url: 'ins_ok.php', type: 'POST', data: new FormData(this), processData: false, contentType: false, success: function (data, status) { $('#ShowData').html(data); $('#Ins')[0].reset(); $('#Data').datepicker('update', ''); }, error: function (xhr, desc, err) { alert('Dati al momento non disponibili. Riprovare pi� tardi.'); console.warn(xhr.responseText); alert(xhr.status); alert(err); } }); }); </script>
Questo va messo fuori da quel blocco:
Le modifiche al PHP le hai gia' fatte?codice:$.ajaxSetup({ beforeSend: function(xhr) { xhr.setRequestHeader('HTTP_X_REQUESTED_WITH_AJAX', 'true'); } });
Modiche PHP fatte
Cosi?
codice:<script type="text/javascript"> $.ajaxSetup({ beforeSend: function(xhr) { xhr.setRequestHeader('HTTP_X_REQUESTED_WITH_AJAX', 'true'); } }); </script> <script type="text/javascript"> $(document).on("submit", "form", function(event){ event.preventDefault(); $('#ShowData').html('<img src="img/loader.gif" height="16" width="16"/>'); $.ajax({ url: 'ins_ok.php', type: 'POST', data: new FormData(this), processData: false, contentType: false, success: function (data, status) { $('#ShowData').html(data); $('#Ins')[0].reset(); $('#Data').datepicker('update', ''); }, error: function (xhr, desc, err) { alert('Dati al momento non disponibili. Riprovare più tardi.'); console.warn(xhr.responseText); alert(xhr.status); alert(err); } }); }); </script>
Controllando per es. con Chrome Dev Tools cosa vedi adesso negli headers sia della request che del response quando tenti una AJAX request e la sessione e' scaduta?