Vaska,
не понимаю. так проверяйте токен, и запоминайте что-то типа
if (sessionStorage.getItem('token') !== token) {
sessionStorage.setItem('token', token);
window.location.reload(true);
}
|
рони,
На одной странице есть три блока, каждый из которого подгружает свою страницу .html с помощью Ajax. Функция PHP, при подгрузке страницы в блок, проверяет не протух ли токен. Если протух, то подставляет скрипт, чтобы перезагрузить страницу и обновить токен. Вот этот код:
if (!localStorage.getItem("reload")) {
localStorage.setItem("reload", "true");
location.reload();
}
else {
localStorage.removeItem("reload");
}
срабатывает для подгрузки одного блока, если токен протух, перезагружает всю страницу. Но если токен снова протух, и я хочу перезагрузить второй блок на той же странице, то перезагрузка не работает. Не знаю как лучше объяснить. |
Vaska,
все токены посылайте в эту функцию, если в массиве такого токена нет, страница перезагрузится.
function saveT(token)
{
let arT = sessionStorage.getItem('token') || "[]";
arT = JSON.parse(arT);
if (!arT.includes(token)) {
arT.push(token)
sessionStorage.setItem('token', JSON.stringify(arT));
window.location.reload(true);
}
}
|
Честно говоря не понял вашу задумку.
Для каждого блока есть запрос Ajax, который вызывает контент в блок. Например, для одного из блоков, на странице, есть код вызова:
$(function() {
//вызывает файл qrcode_tools.html
$('.qrcode_tools_user').mouseover(function(event){
setTimeout(function() {
$("#qrcode_tools_html").load(HOMESITEURL + '/Index/qrcode_tools.html');
}, 50);
$(this).unbind('mouseover');
});
});
В хедере страницы есть код для токена:
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
data: {
'__token__': $('meta[name="csrf-token"]').attr('content')
},
//cache: false,
});
$.ajaxPrefilter('script', function(options) {
options.data = ''; // -токен
options.cache = true; // -таймстэмп
});
В файле PHP я проверяю не протух ли токен и если не протух, то подгружаю контент:
public function qrcode_tools() {
//Проверка общего одноразового токена __token__ и токена для страницы /home/Store/index.html?store_id=1 __token_index__ {:indexToken()}
$csrf_token = input('get.__token__');
//Если $csrf_token пустой, тогда блокировать, чтобы в отдельной странице не открывали без токена в ссылке
if (empty($csrf_token)) {
header("HTTP/1.1 404 Not Found");
echo "Not Found";
exit;
//Проверка токена в ссылке страницы, чтобы совпадал с актуальным токеном и токеном в сессии
} elseif ($csrf_token != session('__token__') && $csrf_token != session('__token_index__')) {
echo '' . lang('page_outdated') . '<br>
<div class="img-loader" style="height:82px;"></div>
<em class="tips_arrow"></em>
<script>
setTimeout(function() {
if (!localStorage.getItem("reload")) {
localStorage.setItem("reload", "true");
location.reload();
} else {
localStorage.removeItem("reload");
}
}, 2000);
</script>
';
exit;
}
//Загружает контент
echo '' . lang('ds_mobile_shopping_better') . '<br>
<img class="img-loader" src="' . HOME_SITE_URL . '/qrcode?url=' . config('ds_config.h5_site_url') . '" width="110" height="110" />
<em class="tips_arrow"></em>';
}
Куда добавить ваш код и что убрать из моего кода? |
Vaska,
не понимаю, и зачем перезагрузка и в целом,не подскажу, нужен другой специалист. |
рони,
Перезагрузка нужна, чтобы обновить токен, если он протух. Токен нужен актуальный для защиты контента от открытия контента вне нужной страницы. |
Vaska,
возможно, вместо строк 15 - 22 надо что-то типа
function saveT(token)
{
let arT = sessionStorage.getItem('token') || "[]";
arT = JSON.parse(arT);
if (!arT.includes(token)) {
arT.push(token)
sessionStorage.setItem('token', JSON.stringify(arT));
window.location.reload(true);
}
}
saveT($csrf_token<!-- или session('__token__')-->)
|
рони,
Сейчас всё правильно работает! Большое спасибо! Можете мне в личку скинуть куда и сколько отблагодарить за помощь? |
Vaska,
Вашего спасибо, достаточно! :) |
| Часовой пояс GMT +3, время: 04:59. |