Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.01.2022, 06:26
Профессор
Отправить личное сообщение для Vaska Посмотреть профиль Найти все сообщения от Vaska
 
Регистрация: 08.05.2017
Сообщений: 178

Как глобально вставить в load() headers
Приветствую!

Есть такой код, который работает.
$("#header_left_html").load(ajaxurl, {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')});

вызывает файл, а так же передает на сервер, для PHP, значение токена "9bd2c66bfa5ee747fc95d1850380fa10".
В упрощеннорм виде такой код:
<!doctype html>
<html lang="ru" class="no-js">
    <head>
		<meta name="csrf-token" content="9bd2c66bfa5ee747fc95d1850380fa10">
		<script src="/jquery-2.1.4.min.js"></script>
	</head>
    <body>
		<div class="all_cat">
			<div id="header_left_html"></div>
		</div>
	</div>			
	<script>	
		//вызывает файл header_left.html
		$('.all_cat').mouseover(function(event){
			var ajaxurl = HOMESITEURL + '/Index/header_left.html?__token__=' + $('meta[name="csrf-token"]').attr('content');
			$("#header_left_html").load(ajaxurl, {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')});
			$(this).unbind('mouseover');
		});	
	</script>		
</body>
</html>


Так как на сайте много используется load() и везде нужно передавать значение токена, то хочу добавлять значение токена через headers в load() добавив скрипт в <head> и убрав из $("#header_left_html").load(ajaxurl); лишнее:
<!doctype html>
<html lang="ru" class="no-js">
    <head>
		<meta name="csrf-token" content="9bd2c66bfa5ee747fc95d1850380fa10">
		<script src="/jquery-2.1.4.min.js"></script>
        <script>	
			$.ajaxSetup({
			headers: {
			'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
			}
			});
		</script>
	</head>
    <body>
		<div class="all_cat">
			<div id="header_left_html"></div>
		</div>
	</div>			
	<script>	
		//вызывает файл header_left.html
		$('.all_cat').mouseover(function(event){
			var ajaxurl = HOMESITEURL + '/Index/header_left.html?__token__=' + $('meta[name="csrf-token"]').attr('content');
			$("#header_left_html").load(ajaxurl);
			$(this).unbind('mouseover');
		});	
	</script>		
</body>
</html>

Но так не работает, значение токена не передается на сервер.

Что я делаю не так?
Заранее спасибо за помощь!
Ответить с цитированием
  #2 (permalink)  
Старый 12.01.2022, 08:50
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,252

Сообщение от Vaska
Что я делаю не так?
Во всех примерах, что я видел, про $.ajaxSetup(), он используется в паре с $.ajax()...
В доке есть вот такие строки
Цитата:
The settings specified here will affect all calls to $.ajax or Ajax-based derivatives such as $.get(). This can cause undesirable behavior since other callers (for example, plugins) may be expecting the normal default settings. For that reason we strongly recommend against using this API. Instead, set the options explicitly in the call or define a simple plugin to do so.
https://api.jquery.com/jQuery.ajaxSetup/

Т.е. он работает с $.ajax() и ему подобным, таким как $.get().
Т.ч. .load() явно не такой метод.

Так же обрати внимание что сами авторы не рекомендуют использовать $.ajaxSetup(). Советуют явно указывать "настройки" в запросах.
Ответить с цитированием
  #3 (permalink)  
Старый 12.01.2022, 09:14
Профессор
Отправить личное сообщение для Vaska Посмотреть профиль Найти все сообщения от Vaska
 
Регистрация: 08.05.2017
Сообщений: 178

Сообщение от ksa Посмотреть сообщение
https://api.jquery.com/jQuery.ajaxSetup/
Я читал эту доку.
Я подумал, что может и про load() есть похожая дока, но я её не нашел.
Ответить с цитированием
  #4 (permalink)  
Старый 12.01.2022, 09:46
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 456

Сообщение от ksa
.load() явно не такой метод.
Такой! Он как и $.get() является фасадом $.ajax().

Сообщение от Vaska
Что я делаю не так?
Когда ты пишешь .load(url, object) производится POST-запрос с телом object, читай доки.
Когда ты пишешь .load(url) производится GET-запрос.
Когда ты пишешь { headers: {} } производится запрос c заголовками headers.

Ты путаешь разные вещи - заголовки запроса и тело запроса.
Ответить с цитированием
  #5 (permalink)  
Старый 12.01.2022, 13:14
Профессор
Отправить личное сообщение для Vaska Посмотреть профиль Найти все сообщения от Vaska
 
Регистрация: 08.05.2017
Сообщений: 178

Сообщение от Rise Посмотреть сообщение
Такой! Он как и $.get() является фасадом $.ajax().


Когда ты пишешь .load(url, object) производится POST-запрос с телом object, читай доки.
Сейчас я применяю такой запрос и это работает.
Однако я бы хотел не прописывать для каждого .load() один и тот же объект токена, ведь токен один и тот же для всех запросов, а я хотел бы прописать один скрипт в <head>, чтобы он раздавал глобально всем ajax.

Как решить эту задачу? Что прописать в скрипт в <head>, чтобы не исправлять каждый .load() и $.ajax() и $.get()?

Последний раз редактировалось Vaska, 12.01.2022 в 13:17.
Ответить с цитированием
  #6 (permalink)  
Старый 12.01.2022, 13:56
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 456

Сообщение от Vaska
Как решить эту задачу?
Написать data вместо headers.
Ответить с цитированием
  #7 (permalink)  
Старый 12.01.2022, 14:12
Профессор
Отправить личное сообщение для Vaska Посмотреть профиль Найти все сообщения от Vaska
 
Регистрация: 08.05.2017
Сообщений: 178

Сообщение от Rise Посмотреть сообщение
Написать data вместо headers.
Да, так работает.
И запрос теперь GET, а не POST. Это тоже лучше. Никакой надобности в POST не было.

Спасибо!

Можете ещё на один вопрос ответить?
Некоторые запросы $.ajax() уже имеют свою data со своими значениями.
Такие $.ajax() примут новую data или будут игнорировать, выполняя только свои data? Или и та data и вторая data будут складывать данные в один запрос?

UPD,
сейчас странно работает в PHP проверка токена.
Если в коде страницы, в браузере, меняю значение в токене один символ, то PHP стравнивая его с сессией, где точно такой же токен, но не видит ошибку и разрешает выполнить полностью запрос .load(). Это неправильная работа.
Когда у .load() своя data с токеном, то PHP ошибку видит и работает правильно, не разрешая выполнить полностью запрос .load().

Последний раз редактировалось Vaska, 12.01.2022 в 14:46.
Ответить с цитированием
  #8 (permalink)  
Старый 12.01.2022, 16:22
Профессор
Отправить личное сообщение для Vaska Посмотреть профиль Найти все сообщения от Vaska
 
Регистрация: 08.05.2017
Сообщений: 178

Я думаю, что токен кешируется в $.ajaxSetup({}), поэтому такое поведение.
Добавил выключить кеш, но не помогло, всё-равно видимо кешируется.

$.ajaxSetup({
 data: {
  'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
 },
 cache: false
});

Как ещё выключить кеш только в $.ajaxSetup({})?

Последний раз редактировалось Vaska, 12.01.2022 в 16:26.
Ответить с цитированием
  #9 (permalink)  
Старый 13.01.2022, 10:23
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,762

Сообщение от Vaska
Как ещё выключить кеш только в $.ajaxSetup({})
По мне, самый надежный метод при get запросах - добавить еще один параметр - какое то случайное число или временная метка. Для браузера это будет выглядеть, как совсем другой запрос, которого нет в кеше

$.ajaxSetup({
 data: {
  'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'),
   time: Date.now(),
 },

});
Ответить с цитированием
  #10 (permalink)  
Старый 13.01.2022, 11:22
Профессор
Отправить личное сообщение для Vaska Посмотреть профиль Найти все сообщения от Vaska
 
Регистрация: 08.05.2017
Сообщений: 178

Сообщение от voraa Посмотреть сообщение
По мне, самый надежный метод при get запросах - добавить еще один параметр - какое то случайное число или временная метка. Для браузера это будет выглядеть, как совсем другой запрос, которого нет в кеше

$.ajaxSetup({
 data: {
  'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'),
   time: Date.now(),
 },

});

Вот что пишут про timestamp здесь
Цитата:
не используйте timestamp для создания уникального URL, так как каждая страница, которую вы посещаете, кэшируется в DOM на jquery mobile, и вскоре вы столкнетесь с проблемой нехватки памяти на мобильных телефонах.
Даже если не добавлять timestamp, всё-равно накешируется миллион адресов, токен же каждый раз новый генерирует для страницы.
Кеш надо выключать для токенов, я так думаю.

Последний раз редактировалось Vaska, 13.01.2022 в 11:30.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
document.write как вставить большое количество html с кавычками одинарными Darth_Pandora Элементы интерфейса 1 11.10.2017 14:39
как вставить переменную в правило регулярки prog77 Javascript под браузер 8 05.07.2017 14:30
Как вставить сериализованную строку в SVG ? ravend Общие вопросы Javascript 2 06.07.2015 12:48
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
Как считать файл с винта и вставить его в mht-файл ? potkin Общие вопросы Javascript 4 26.08.2008 14:17