Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Кроссдоменный ajax-запрос

Здравствуйте. Возникла проблема при составлении ajax запроса на другой сервер. Задача я упростил: отправить текстовую строку на другой сервер, там скрипт запрос получает, и отсылает какой-то ответ клиенту. Вот собственно код:
function test(){
 
            $.ajaxSetup({
                beforeSend: function(xhr) {
                    xhr.setRequestHeader('Access-Control-Allow-Origin', 'http://domen2.mu/');
                }
            });
 
            var text = "b";
            $.ajax({
                url: "http://domen2.mu/test/check2.php",
                type: "post",
                processData: false,
                data: text,
                xhrFields: {
                    withCredentials:true
                },
                success: function(data){
                    alert( "Прибыли данные: " + data );
                }
            });
 
        }

На сервере чисто учебный тестовый скрипт в три строки, который прост отправляет строку.
В результате хром выдает такую ошибку ошибку:
Код:
OPTIONS http://domen2.mu/test/check2.php Origin http://domen1.mu is not allowed by Access-Control-Allow-Origin. jquery-1.10.0.min.js:6
XMLHttpRequest cannot load http://domen2.mu/test/check2.php. Origin http://domen1.zz.mu is not allowed by Access-Control-Allow-Origin.
Добавление заголовка Access-Control-Allow-Origin с параметром http://domen2.mu/, не помогла. После выполнения скрипта я его в списке заголовков так и не увидел. Пробовал писать headers прямо в теле ajax-запроса, результат тот же. Хотелось бы, конечно, использовать именно $.ajax для такого запроса, но если решения не будет, то буду смотреть в сторону полноценного XHR2 Подскажите где я ошибся.
Ответ: Есть неплохое решение, но с использованием php:
1. Создаём в своём домене файл PHP, php вполне нормально может прочитать файл с другого домена и даже его обработать при необходимости.
2. Создаём AJAX запрос к своему php-файлу и работаем с данными.

Решение конечно не на чистом JS, но это решение.
Вопрос: Проверка источника AJAX запроса внутри вызываемого скрипта

Проблема следующая

Со страницы сайта с помощью AJAX запроса вызывается скрипт execute_query.php который выполняет sql запрос в базу данных.
Скрипту передается параметр query - который содержит запрос к базе данных.

Можно ли достоверно убедиться что AJAX запрос пришел от внутреннего скрипта сайта, а не от стороннего скрипта?

Для простоты понимания проблемы
Если AJAX запрос с методом GET то зарегистрированному пользователю для выполнения своего собственного запроса достаточно лишь виполнить следующий HTTP запрос запрос пользователя.
Если запрос с методом POST то надо написать простенький HTML документ в котором будет послан AJAX запрос.
Единственное что этому припятствует это знание структуры базы данных.
Ответ: Да всё так, только вдумчиво. Чтобы не получилось, что ты стоишь в защитной каске и при этом голый.

Добавлено спустя 9 минут 9 секунд:
Re: Проверка источника AJAX запроса внутри вызываемого скрипта


Вопрос: Параметры двух select для ajax запроса. Нужен совет

Доброго дня! Подскажите пожалуйста как правильно реализовать с точки зрения оптимизации, а то понимаю что расплодил сущностей. Суть в следующем:

1. Есть 4 выпадающих списка. Они зависимые друг от друга. Не могу понять, как правильно организовать отправку выбранных параметров на сервер, т.е. глупо писать на каждый выпадающий список событие change и вызывать аякс запрос с отправкой параметров, а то их 4 штуки получится.

2. Мне хотелось бы сделать таким образом, когда я выбираю последние зависимые выпадающие списки, чтобы считывались все выбранные мною элементы и отсылались единственным ajax запросом. Кнопочку Submit я не использую т.к. задумка именно такая, чтобы при выборе любого из селектов подгружалась инфа которая нашлась в базе по выбранным id-шникам. Ну думаю смысл понятен. Как именно сделать это правильно!? Заранее спасибо, вот код... 2 аякс запроса мне нужны для подгрузки зависимых селектов, наверное это тоже не верно и можно одним справиться... Буду благодарен за любые советы

/** серия - первая */ 
       $( '#series_one' ).on('change', function(){
            $.ajax({
    			data     : 'seriesID='+this.value,
    			url      : "<?=$this->createUrl('/site/SelectComplectation')?>",
    			success  : function(html){                    
                    if(html != '') $('#complectation_one').prop('disabled', false).html(html);
    				else $('#complectation_one').attr('disabled','disabled').html('<option>...</option>');                     
    			}
    		});  
       });
              
       /** серия - вторая */ 
       $( '#series_two' ).on('change', function(){
            $.ajax({
    			data     : 'seriesID='+this.value,
    			url      : "<?=$this->createUrl('/site/SelectComplectation')?>",
    			success  : function(html){                    
                    if(html != '') $('#complectation_two').prop('disabled', false).html(html);
    				else $('#complectation_two').attr('disabled','disabled').html('<option>...</option>');                     
    			}
    		});  
       });
       
       
       /** комплектация серии */ 
       $('#complectation_one').on('change', function(){
            $.ajax({
    			data     : 'complectationID_one='+this.value,
                type     : "POST",
    			url      : "<?=$this->createUrl('/site/SelectOption')?>",
    			success  : function(html){                    
                    if(html != '') $('#tabResult').html(html);              
    			}
    		}); 
       });
       
        /** комплектация серии */ 
       $('#complectation_two').on('change', function(){
            $.ajax({
    			data     : 'complectationID_two='+this.value,
                type     : "POST",
    			url      : "<?=$this->createUrl('/site/SelectOption')?>",
    			success  : function(html){                    
                    if(html != '') $('#tabResult').html(html);              
    			}
    		}); 
       });
Ответ: У вас зависимые списки, а это означает, что выбор в любом из них, это очистить все следующие, получить значения для следующего и заполнить его. То есть операции над всеми списками одни и те же. Это раз.

Каждый из списков храниться на сервере под своим именем, а это означает, что имена списков могут служить ключом для сервера, по которому он определит данные какого списка запрашиваются. Это два.

Если каждый из списков в качестве имени будет иметь имя под которым его данные содержаться в базе (эти имена в списках смещены влево), то:

а) все списки имеют один и тот же обработчик изменения их состояния;
б) обработчик очищает все списки после текущего (источника события);
в) асинхронный запрос отправляет на сервер параметр как this.name=this.value
г) сервер получает данные запрашиваемого списка и возвращает их как JSON;
д) клиент заполняет следующий список по полученным данным.
Вопрос: Собственные логи Ajax запросов

Как бы реализовать такое. Все работает без проблем, но иногда пользователи жалуются на то и это. А понять, что у них там не так не получается. Как бы сделать собственное логирование с результатом ответа Ajax запроса, что там, почему и когда у них произошло. И стоит стоит также учесть повисшие запросы. Нажал он к примеру кнопочку, ну и к примеру загрузил себе файл с запросами во время данного соединения и отправил мне.
Заранее благодарен
Ответ:
Сообщение от mmotor
Нет мне надо узнать, что клиент отправляет и что получает в ответ, или не получает, и сколько на это времени у него уходит. Чтобы узнать, то ли у него мускул упал, то ли это ошибка сервера, и если да то какая и когда произошла, то ли ответа вообще не поступило, то ли интернет оборвался, то ли php вывел ошибку, то ли еще что-нибудь о чем я не подумал.
Для таких вещей обычно ведут журналирование запросов в базе: пришел запрос, записали дату, тело запроса, откуда пришел, входящий /исходящий и тд и тп. Отправили запрос записали в журнал.
но уж точно не пытаться сохранить где то у пользователя эти данные и уж точно не надеяться на то что он будет искать кнопочку для отправки.
Вопрос: Как заставить Pace работать для каждого AJAX-запроса?

Как заставить Pace работать для каждого AJAX-запроса?
github.hubspot.com/pace
Он работает лишь при загрузке страницы (у меня там одностраничное приложение). А потом, когда я со страницы делаю AJAX-запросы, то полоска прогрессбара больше не появляется. Уже все опции Pace перебрал, но это ничего не дало.

Метод Pace.restart() дает странный результат, полоска пробегает безотносительно успел выполнится запрос или нет. Да и вообще, хотелось бы чтобы Pace автоматически распознавал запросы и показывал прогрессбар.
Ответ: Спасибо! Вроде работает. Пишу вроде, потому-что полоска теперь появляется, но не всегда. То-ли запрос сервер быстро отрабатывает и полоска при этом не успевает появиться, то ли еще что-то.

В документации об этом ни слова(((
Вопрос: странный ответ на ajax запрос

Всем хай. Не работает у меня ajax запрос, код в JS:
$.ajax({
			type:'POST',
			url:'/check_login.php',
			data:{login: "123"},
			success: function(msg) {
				alert(msg);
			},
			error: function(err) {
				alert('err');
			}
		});

Код в check_login.php:
<?php echo $_POST['login'] ?>

Вывод в alert:

Объясните почему выводится код документа, а не то что в echo.
Ответ: Rise,
такой бардак возможно, если эта страница и родитель клиентского скрипта запроса, а РНР скрипт обработчик запроса расположен ниже основного контента.
Вопрос: Кеширование AJAX запросов

Всем привет!
Можно ли как нибудь кешировать AJAX запросы, как будто скрипты и стили?
Я имею ввиду, что если ответ поменялся - загрузить его, а если нет - брать из кеша,
Например, при загрузке скриптов и стилей в ответ идет серверный код "304 Not Modified"(если они не поменялись),
А если поменялись - код 200
Можно ли сделать такое для AJAX запросов?
Зарание спасибо
Ответ: Наврал, не статьи, а список статей, который разбит типа на страницы. Этот список и кешируется, а статьи загружаются обычным запросом, ибо чтобы загружать по аяксу нужно мудрить с history, гемор.

load=function(e){
		if(loading)
			return;
		page=Math.max(1,page+(this.id.match(/next/)?1:-1));
		if(typeof pages[page]===U) {
			loading=true;
			send_get(location.href+'?page='+page,function(e){
				loading=false;
				if(e.responseText.length>1) {
					var data=JSON.parse(e.responseText);
					pages[page-1]=side_cont.innerHTML;
					side_cont.innerHTML=data.innerHTML;
				}
				else
					stop();
			});
		}
		else
			side_cont.innerHTML=pages[page];
	},


Как обычно написано по-быстрому в расчете потом все причесать и брошено нах, ибо и так работает.

Это уже на другом сайте я сделал нормальную имитацию смены урла при загрузке статьи аяксом, но кешировать ничего не стал, в силу особенностей самих статей - всяки там ебауты, факи, справка и тп. то есть разнобой всякий.
Вопрос: Ошибка при AJAX запросе при переходе на HTTPS "This request has been blocked.."

Всем привет.

Сломал уже голову. При отправке файла AJAX запросом, выдается ошибка "This request has been blocked; the content must be served over HTTPS."

Целиком ошибка выглядит так:


Mixed Content: The page at 'https://site.ru/admin/article/1/edit' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint 'http://site.ru/admin/article/images-upload?fileapi14827790438075'. This request has been blocked; the content must be served over HTTPS.


100% запрос шлю на https.

Использую библиотеку FileAPI. Но с plupload была так же самая история.
Ответ:
Сообщение от WhiteFalke
'http://site.ru/admin/article/images-upload?fileapi14827790438075'
Сообщение от WhiteFalke
100% запрос шлю на https.
Ты не видишь разницы в протоколе?
Вопрос: Ajax запрос через прокси!

Всем доброго времени суток! На сайте использую скрипт, который выполняет Ajax запрос вида: result = $.ajax('http://site.ru/info/filter.php?filter=127&key=102b2a2-51'); Как его можно выполнять через прокси сервер? Проксик защищён логином и паролем! Благодарю за внимание!
Ответ: LungDesire, значит отправляйте ajax запрос на свой php скрипт. А этот php скрипт уже должен обращаться к google на нужный адрес и через ваш прокси. И также надо чтобы, этот php скрипт в последствии вернул тоже самое что и гугл
Вопрос: Ajax запрос - как получить структурированный ответ?

В примерах которые я нашел в интернете, если нужно в страницу с которой был ajax запрос передать данные, используется конструкция echo с помощью которой формируется текст ответа.

ajax запрос
Код:
var val 1234567;
$.
ajax({
    
method"GET",
    
url"simple.php",
    
data: {"param1"val},
    
asyncfalse,
    
success: function(data){
        
alert(data);
    }
}); 


simple.php
Код:
<?php
$p1 
$_GET["param1"];
......
echo 
"тра-та-та";
echo 
"ля-ля-ля";
echo 
"и так далее";
...
exit;
?>


Вопрос: можно ли в ajax запросе получить от php скрипта структурированный ответ?

Например: как при перенаправлении на конкретную страницу используя функцию header
header('Location: тра-та-та&msg2=ля-ля-ля&msg3=');
При этом передаются значения конкретных переменных

Подсказка от модератора:
Любой код или текст конфигурации пишите между тегом [code=php] и [/code].
Используйте отступы в коде для форматирования текста.
Это помогает быстрее понять вас, увеличивает шанс на получение ответа.
Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
Ответ: Можно просто рисовать новый или перерисовывать имеющийся элемент.
Возвращайте корректный ответ и помещайте содержимое в новый элемент или перерисовывайте имеющиеся элементы.
И не пишите много echo. плохая привычка.
- есть прототип передачи переменных как в функции, если Вам так будет понятнее.
Код:
$var1 = 1;
$var2 = 'string';
$p1 = isset($_GET["param1"]) ? $_GET['param1'] : ''; // php 7 - $_GET['param1'] ?? $_GET['param1'];
echo $var1,
 $var2,
 'param1:',
 $p1;

А вообще, тут сначала азы подучите:



Модератор! Не засирай посты. Измените вы уже этот <матное слово=""> code, не позорьтесь :)
пуcть уже [ code=php ][/ code ] Будет и напишите вы выше редактора крупно жирно красным правило и если не доходит уже до людей банить и удалять мусор. Чем больше ненужной информации вычистить тем будет лучше. А вы наоборот пополнение занимаетесь.