Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.02.2020, 01:40
Аспирант
Отправить личное сообщение для win32s Посмотреть профиль Найти все сообщения от win32s
 
Регистрация: 28.09.2019
Сообщений: 38

Распознать ajax на стороне сервера
Здравствуйте
Есть такой код для определения аякс запроса
if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') 
{
    echo 'Это ajax запрос!


Он прекрасно работает с jQuery, но почему-то совершенно не ловит такой запрос:
var aj = new XMLHttpRequest();
		aj.onload  = function (e) 
			...вырезано..
		aj.open("get",req, true);
		aj.send();

Последний хром, по ф12 показывает, что такого заголовка вообще нет. Если я его добавляю вручную
aj.setRequestHeader("X-Requested-With","XMLHttpRequest");
, то все гуд.

Но почему так? Где я ошибся?
Ответить с цитированием
  #2 (permalink)  
Старый 17.02.2020, 05:00
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

HTTP_X_ - это заголовок нестандартный, пользовательский, JQ такой передает, а XMLHttpRequest нет. Просто передайте такой заголовок и будет вам счастье.
Ответить с цитированием
  #3 (permalink)  
Старый 17.02.2020, 11:52
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Сообщение от win32s
Есть такой код для определения аякс запроса
не стоит отделять запрсы аякс от не аякс ибо в этом нет никакого практического смысла
Ответить с цитированием
  #4 (permalink)  
Старый 17.02.2020, 12:34
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,762

Разные ситуации бывают.
Мы как то переводили большой сайт, который как обычно генерил на php странички, на одностраничное приложение. Так дешевле было в сервернуюю часть включить такие проверки, что бы в случае ajax запроса выдавать только данные в json, а не всю страницу.
Ответить с цитированием
  #5 (permalink)  
Старый 17.02.2020, 12:42
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,762

Сообщение от Rise Посмотреть сообщение
Почему?
Если с нуля делаешь сайт, то ты и так знаешь, какие запросы идут.
А если вместо XMLHttpRequest, будешь использовать fetch, то этот заголовок не пойми зачем все равно ручками придется писать
Смысл может быть только, если по одному и тому же запросу, в зависимости от заголовка нужно выдавать разные данные. Но если делаешь с нуля, то проще добавить в запрос лишний параметр - в каком виде хочешь получить данные.
Ответить с цитированием
  #6 (permalink)  
Старый 17.02.2020, 13:12
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,762

Сообщение от Rise Посмотреть сообщение
Но можешь вместо XMLHttpRequest написать fetch, это же кастомный заголовок, можешь само название X-Requested-With изменить X-Voraa-With: fetch.

Ну не знаю, обстоятельства разные бывают, например, в кросс-доменных запросах параметр не спасет.
И я про то.
Главное, что бы серверная часть понимала о чем идет речь.
Если серверная часть уже существует, и требует каких то своих заголовков, то вынь и положь их ей. Без разницы, кросс-доменный запрос или нет. А если все делаешь с нуля, то зачем они нужны?
Ответить с цитированием
  #7 (permalink)  
Старый 17.02.2020, 15:17
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от win32s
Есть такой код для определения... запроса
Давайте поменяем код на сервере (который запущен, к примеру, http://localhost:5000/), чтобы он возвращал чистый запрос (т. е. само содержимое запроса перед его обработкой сервером)

Теперь отправим POST-запрос при помощи jQuery (последняя версия на данный момент — 3.4.1)
import("https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js").then(async () => {
	const data = await $.ajax({
		url: "http://localhost:5000/",
		method: "POST",
		timeout: 0,
		headers: {
			"Content-Type": "text/plain"
		},
		// crossDomain: false,
		data: "Hi!",
	});

	console.log(data);
})();


Получим то, что отправляли...
Код:
POST / HTTP/1.1
Host: localhost:5000
Connection: keep-alive
Content-Length: 3
Accept: */*
Sec-Fetch-Dest: empty
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36
Content-Type: text/plain
Origin: https://cdpn.io
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: cors
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,ru;q=0.8,es;q=0.7,et;q=0.6

Hi!
При внимательном рассмотрении вы увидите, что заголовка X-Requested-With нет. Он появляется, если указать crossDomain: false (так захотели разработчики jQuery), но тогда вам нужно, чтобы сервер разрешал такой заголовок (Access-Control-Allow-Headers: X-Requested-With)

Кстати, этот заголовок можно легко вырезать при помощи Service Worker! Также вы можете добавить этот заголовок для всех запросов! Также вы можете сделать запрос на любом другом языке и подставить этот заголовок. Возникает вопрос, для чего нужен этот заголовок?

Сообщение от win32s
Распознать... на стороне сервера
  • Если вы хотите, чтобы в браузере открывался HTML-документ, а при запросе через fetch, XMLHttpRequest сервер возвращал, например, JSON, то используйте заголовок Accept: application/json. В отличие от X-Requested-With, при помощи Accept вы можете работать с различными представлениями данных.
  • Если вы хотите, чтобы содержимое было доступно только при запросе через fetch, XMLHttpRequest, потому что вы думаете, что это ограничивает доступ к данным, то вам нужно подумать о настоящей авторизации для доступа к данным. Тогда у вас будет токен, который вы будете отправлять через заголовок, например, Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6Ikp... В отличие от X-Requested-With, при помощи Authorization вы можете работать с данными, предназначенными для конкретного пользователя.
  • Если вы хотите, чтобы определённые версии данных были доступны пользователям определённой программы или её версии, то вы можете и такое указать, например, заголовок для мобильного приложения MyApp версии 1.22.0 — User-Agent: MyApp/1.22.0

Конечно по отдельности эти заголовки тоже полезны, однако указав Accept, Authorization, User-Agent и возможно другие стандартные заголовки, вы сможете отправить именно те точные данные, которые нужны пользователю!

Никогда не полагайтесь на нестандартный X-Requested-With, всегда используйте стандартные заголовки, которые точно позволяют уточнить, что именно вы хотите получить. Кстати, так называемый вами «аякс запрос» на самом деле является обычным GET- или POST-запросом, который может быть выполнен при помощи любого языка программирования (вне браузерного окружения работа с запросами немного мощней), и вы никак не поймёте на сервере, что это было сделано не при помощи jQuery!

Сообщение от laimas
Просто передайте такой заголовок и будет вам счастье.
Этот заголовок разве что подходит для отладки, чтобы можно было в Chrome DevTools во вкладке Network отфильтровать запросы... хотя и это походит на натягивание презерватива на глобус! (А что, если несколько источников запросов? Не проще ли указать конкретный адрес и заголовок?)

Сообщение от win32s
аякс
«Эйджякс», означает «Асинхронный Javascript и XML» — термин, который не очень хорошо описывает, что же на самом деле происходит. «Клиент», «запрос», «сервер», «ответ» — намного лучше и понятней, что именно имеется в виду.

И ещё это ваше «аякс» в «Уарайано́у бяура́якс» звучит совершенно непонятно! Это будет — «Эйджякс», оно конечно не совсем ['eɪ'dʒæks], но намного лучше и понятней, чем «аякс». Ещё веб-слова, которые ты, возможно, уже выучил, но их так не произносят — https://web-english.glitch.me/

Сообщение от Poznakomlus
не стоит отделять запрсы аякс от не аякс ибо в этом нет никакого практического смысла
Бинго!

Последний раз редактировалось Malleys, 17.02.2020 в 15:19.
Ответить с цитированием
  #8 (permalink)  
Старый 17.02.2020, 21:07
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Сообщение от Rise
Почему?
Потому как это обычный запрос. С еще одним заголовком
Если нужен тип ответа то можно использовать accept
Но лучше явно прописывать в пути маршрута или передаваемом параметре, гораздо нагляднее
Ответить с цитированием
  #9 (permalink)  
Старый 21.02.2020, 15:08
Аспирант
Отправить личное сообщение для win32s Посмотреть профиль Найти все сообщения от win32s
 
Регистрация: 28.09.2019
Сообщений: 38

Сообщение от laimas Посмотреть сообщение
Просто передайте такой заголовок и будет вам счастье.
Да, я так и сделал на стороне js.
Сообщение от Poznakomlus Посмотреть сообщение
не стоит отделять запрсы аякс от не аякс ибо в этом нет никакого практического смысла
в моем случае , если аякс - то сервер отдает только небольшую часть контента, а если нет - то весь.
Не знаю, насколько это правильно, веб разработка не мой основной профиль.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ajax получение сообщение от сервера потом перезагрузка kupidon AJAX и COMET 11 26.10.2018 15:33
ajax изменение датты сервера aibol AJAX и COMET 6 27.09.2017 19:53
ответ от сервера (ajax) gam0ra Общие вопросы Javascript 3 16.12.2014 15:11
AJAX + PHP загрузка файлов с сервера Stanisov AJAX и COMET 10 16.08.2013 11:18
Подгрузка информации через DIV с обработкой файла на стороне сервера Azartno jQuery 1 26.05.2012 15:07