2016-02-05 7 views
7

Próbuję utworzyć stronę logowania z domeny krzyżowej, ale nie mogłem rozwiązać problemu, błąd jest :Pole nagłówka żądania Kontrolki dostępu do kontrolki zezwalającej na dostęp nie są dozwolone przez Kontrolki dostępu-pozwalają-zezwalać na odpowiedź preflight

XMLHttpRequest cannot load http://localhost/testing/resp.php . Request header field Access-Control-Allow-Headers is not allowed by Access-Control-Allow-Headers in preflight response.

mojego kodu JavaScript jest:

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

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

kod PHP do http://localhost/testing/resp.php:

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

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

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

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

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

 
?>

+0

Czy możesz użyć narzędzi do wyszukiwania przeglądarki, aby dowiedzieć się, jakie nagłówki rzeczywiście są zwracane? Mówiąc ogólniej: nie jest to dobry pomysł na logowanie ze wszystkich domen, to pozostawia cię podatną na takie rzeczy jak CSRF (standardowa ochrona tokena sprawdzania * wymaga *, że przeglądarka blokuje żądania dotyczące różnych źródeł pochodzenia). – Matthew

+0

Twój serwer wysyła żądania preflight. PHP jest renderowane przez serwer. Musisz zwrócić nagłówek z samego silnika serwera. – ryan0319

Odpowiedz

9

usunąć ten:

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

od rozmowy jQuery.ajax.

Serwer odpowiada nagłówkiem Access-Control-Allow-Headers, klient nie wysyła go do serwera.

Klient wysyła Access-Control-Request-Headers, aby zażądać zezwolenia na określone nagłówki, serwer odpowie ponownie za pomocą Access-Control-Allow-Headers, który zawiera listę faktycznych nagłówków, na które zezwala. Klient nie musi żądać, jakie nagłówki są dozwolone.

+0

Nagłówek żądania zniknął, ale nie otrzymałem żadnej odpowiedzi od serwera – Anahoua16

+0

@ Anahoua16, dodaj wywołanie błędu do twoich opcji ajax, tj. 'Error: function() {}' i zobacz, czy jego wyzwolenie zostanie wywołane, jeśli tak zrobisz status/błąd, który został przekazany –

+0

Status: 200 textStatus: parsererror errorThrown: SyntaxError: Niespodziewany token s – Anahoua16