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, время: 00:21. |