web-dev-qa-db-fra.com

Le champ d'en-tête de demande Access-Control-Allow-Headers n'est pas autorisé par Access-Control-Allow-Headers dans la réponse de contrôle en amont

J'essaie de créer une page de connexion à partir d'un domaine croisé mais je n'ai pas pu résoudre le problème, l'erreur est:

XMLHttpRequest ne peut pas se charger http: //localhost/testing/resp.php . Le champ d'en-tête de demande Access-Control-Allow-Headers n'est pas autorisé par Access-Control-Allow-Headers dans la réponse de contrôle en amont.

Mon code Javascript est:

$('#login').click(function(){
                var username = $('#uname').val();
                var password = $('#pass').val();
                var result = $('.result');
                result.text('loading....');

                if (username != '' && password !=''){
                        var urltopass = 'action=login&username='+username+'&password='+password;
                        $.ajax({
                                type: 'POST',
                                data: urltopass,
                                headers: {"Access-Control-Allow-Headers": "Content-Type"},
                                url: 'http://localhost/testing/resp.php',
                                crossDomain: true,
                                cache: false,
                                success: function(responseText){
                                        console.log(responseText);
                                        if(responseText== "0"){
                                                result.text('incorrect login information');
                                        } else if (responseText == "1"){
                                                window.location="http://localhost/testing/home.php";
                                        } else{
                                                alert('error in sql query \n' + responseText);
                                        }
                                }
                        });
                } else return false;
        });

Le code PHP pour http: //localhost/testing/resp.php :

<?php
        include "db.php"; //Connecting to database

        if (!isset($_SERVER['HTTP_Origin'])) {
                echo "This is not cross-domain request";
    exit;
}
        header("Access-Control-Allow-Origin: *");
        header("Access-Control-Allow-Credentials: true");
        header("Access-Control-Allow-Methods: POST, GET, OPTIONS");
        header("Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With");
        header('P3P: CP="CAO PSA OUR"'); // Makes IE to support cookies
        header("Content-Type: application/json; charset=utf-8");

        if (isset($_POST['action']) && $_POST['action'] == 'login'){
                $uname = $_POST['username'];
                $pass = $_POST['password'];

                $sql = "SELECT * FROM loginajax WHERE username='$uname' AND password='$pass'";
        
                $rs=$conn->query($sql);

                if (mysqli_num_rows($rs) <= 0){
                        echo "0";
                } else {
                        echo "1";
                }
                
        } else echo "this is not Login";

?>
9
Anahoua16

enlève ça:

headers: {"Access-Control-Allow-Headers": "Content-Type"},

à partir de votre appel jQuery.ajax.

Le serveur répond par un Access-Control-Allow-Headers en-tête, le client ne l'envoie pas au serveur.

Le client envoie un Access-Control-Request-Headers pour demander l'autorisation de certains en-têtes, le serveur répond avec un Access-Control-Allow-Headers qui répertorie les en-têtes réels que cela va autoriser. Le client ne peut pas demander quels en-têtes sont autorisés.

12
Patrick Evans