La fuerza de redirección después de Jquery AJAX Llamada de PHP

Tengo un marco de trabajo personalizado y puedo detectar si una petición es una ajax en mi Solicitud archivo. En mi basecontroller puedo comprobar si el usuario se registra en:

If user is not logged in:
  1. if request is ajax - force JS redirect from PHP (unable to do)
  2. if request is not ajax - PHP redirect (header, works)

Puedo conseguir el número de 1 a trabajar.

Aquí está mi código de redirección:

//User::Redirect
public function redirect($url = SITE_URL, $isAjax = false) {
    if ($isAjax === true) {
        //its ajax call, echo js redirect
        echo '<script>window.location = ' . $url . ';</script>';
    } else {
        header("Location: {$url}");
    }
    exit;
}

Código de inicio de sesión de verificación:

//Basecontroller::__construct
if ( ! $this->user->isLoggedIn()) {
   //redirect to login page
   $this->user->redirect('/login', $request->ajax()); 
   exit;
}

Pero en lugar de redireccionar en ajax llamadas sólo salidas <script>window.location = URL</script>

NOTA:

Sé que yo podría agregar de verificación en cada una de mis llamadas AJAX para hacer redirección de allí, pero estoy tratando de evitar eso y dejar que mi script PHP detectar en el controlador de la base y redirigir vez que me la adición de verificación a todos mis llamadas AJAX (un montón).

  • Solo como recomendación, yo tiendo a pasar todas las llamadas ajax a través de una función genérica, y esta función se encarga de la redirección http, si ha sido enviado.
  • así que usted tiene un gran archivo que contiene todas las llamadas ajax ?
  • no tengo un pequeño archivo, que contiene un genérico función de ajax, con un par de variaciones para diferentes propósitos, pero en última instancia, cada solicitud pasa a través de la misma función.
  • te refieres a una función de Javascript que se utiliza para llamar a todos ajax?
  • sí. así que todas mis llamadas ajax en alguna manera de ir a través de esta función, que maneja varias respuestas http, incluyendo redirigir.
  • Yo puede ser que necesite para hacer que si no puedo encontrar una solución a este

InformationsquelleAutor GGio | 2013-08-06

3 Kommentare

  1. 3

    Su redirección de Javascript necesidades de etiquetas de secuencia de comandos. Intente esto:

    public function redirect($url = SITE_URL, $isAjax = false) {
        if ($isAjax === true) {
            //its ajax call, echo js redirect
            echo '<script>window.location = ' . $url . ';</script>';
        } else {
            header("Location: {$url}");
        }
        exit;
    }

    En términos de la manipulación de este dentro de su ajax, asumiendo jQuery

    $.ajax(
        {
            type: "POST",
            url: url,
            data: postParams,
            success: function(data)
            {
                //do something with success response
            },
            error : function(httpObj, txtStatus)
            {
                if(httpObj.status == 401)
                {//redirect to login
                    var loginUrl = '/login';
                    document.location.href = loginUrl;
                }
                else if(httpObj.status == ...)  //etc
                {//do something
    
                }
                else
                {
                    alert("Ajax\n Error: " + txtStatus + "\n HTTP Status: " + httpObj.status);
                }
            }
    • Usted puede ser que falte el html circundante. Echa un vistazo a la respuesta de Nick anterior.
    • todavía nada, incluso con html
    • agregar esta línea header("HTTP/1.1 401 Unauthorized");
  2. 1

    ¿Cómo es el cliente supone que se sabe que es javascript?

    Tratar de encerrar con etiquetas de secuencia de comandos
    es decir,

    <html>
    <script>
    window.location = 'testpage.html'
    </script>
    </html>
  3. 0

    Este código funciona para mí. Si una llamada ajax encuentra el usuario no está conectado (por ejemplo: el usuario ha abandonado su navegador abierta, y su sesión ha caducado) el PHP echo a cabo la actualización de código, ya sea como JS o una etiqueta meta para el navegador para forzar una actualización de la página entera.

    $url = '/index.php';
    
    echo '<script type="text/javascript">';
    echo 'window.location.href="'.$url.'";';
    echo '</script>';
    echo '<noscript>';
    echo '<meta http-equiv="refresh" content="0;url='.$url.'" />';
    echo '</noscript>';

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea