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";
?>
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
Twój serwer wysyła żądania preflight. PHP jest renderowane przez serwer. Musisz zwrócić nagłówek z samego silnika serwera. – ryan0319