
12.01.2022, 06:26
|
Профессор
|
|
Регистрация: 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>
Но так не работает, значение токена не передается на сервер.
Что я делаю не так?
Заранее спасибо за помощь!
|
|

12.01.2022, 08:50
|
 |
CacheVar
|
|
Регистрация: 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(). Советуют явно указывать "настройки" в запросах. 
|
|

12.01.2022, 09:14
|
Профессор
|
|
Регистрация: 08.05.2017
Сообщений: 178
|
|
Я читал эту доку.
Я подумал, что может и про load() есть похожая дока, но я её не нашел.
|
|

12.01.2022, 09:46
|
Профессор
|
|
Регистрация: 07.11.2013
Сообщений: 456
|
|
Сообщение от ksa
|
.load() явно не такой метод.
|
Такой! Он как и $.get() является фасадом $.ajax().
Сообщение от Vaska
|
Что я делаю не так?
|
Когда ты пишешь .load(url, object) производится POST-запрос с телом object, читай доки.
Когда ты пишешь .load(url) производится GET-запрос.
Когда ты пишешь { headers: {} } производится запрос c заголовками headers.
Ты путаешь разные вещи - заголовки запроса и тело запроса.
|
|

12.01.2022, 13:14
|
Профессор
|
|
Регистрация: 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.
|
|

12.01.2022, 13:56
|
Профессор
|
|
Регистрация: 07.11.2013
Сообщений: 456
|
|
Сообщение от Vaska
|
Как решить эту задачу?
|
Написать data вместо headers.
|
|

12.01.2022, 14:12
|
Профессор
|
|
Регистрация: 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.
|
|

12.01.2022, 16:22
|
Профессор
|
|
Регистрация: 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.
|
|

13.01.2022, 10:23
|
 |
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,762
|
|
Сообщение от Vaska
|
Как ещё выключить кеш только в $.ajaxSetup({})
|
По мне, самый надежный метод при get запросах - добавить еще один параметр - какое то случайное число или временная метка. Для браузера это будет выглядеть, как совсем другой запрос, которого нет в кеше
$.ajaxSetup({
data: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'),
time: Date.now(),
},
});
|
|

13.01.2022, 11:22
|
Профессор
|
|
Регистрация: 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.
|
|
|
|