При выходе из моего приложения Laravel с использованием метода выхода Laravel:
public function getLogout() { Auth::logout(); return Redirect::to('users/login')->with('message', '<div class="alert alert-success">Your have successfully logged out</div>'); }
Я успешно вышел из системы, но, нажав кнопку «Назад», я могу получить доступ к моей учетной записи. Любая идея о том, как я могу это исправить?
Я новичок в laravel, поэтому я не уверен, имеет ли смысл мой вопрос. Ну, в простой PHP, ручная перезагрузка сеанса до нуля всегда выполняла эту работу для меня.
Вот как я решил это в промежуточном программном обеспечении Laravel 5:
Создайте промежуточное ПО NoCache следующим образом:
Пройдите это: Как мне реализовать до и после фильтров в промежуточном программном обеспечении?
class NoCache { public function handle($request, Closure $next) { $response = $next($request); $response->headers->set('Cache-Control','nocache, no-store, max-age=0, must-revalidate'); $response->headers->set('Pragma','no-cache'); $response->headers->set('Expires','Fri, 01 Jan 1990 00:00:00 GMT'); return $response; } }
Затем зарегистрируйте это промежуточное программное обеспечение в kernel.php: Запуск промежуточного программного обеспечения по каждому запросу
На самом деле это не так, как вы думаете.
Кнопка «Назад» в браузере извлекает последнюю страницу в кеше для вас.
Если вы действительно должны это предотвратить, у вас есть два варианта:
Лично я просто виню кэширование и игнорирую его. Существует также третий вариант: использование API истории HTML5, но это, вероятно, путь сверху.
Я пробовал с этим, и он работает.
В маршрутах:
Route::group(array('before' => 'auth', 'after' => 'no-cache'), function() { Route::get('dashboard', array('as' => 'getDashboard', 'uses' => 'DashboardController@getIndex')); Route::get('logout', array('as' => 'getLogout', 'uses' => 'LoginController@getLogout')); Route::group(array('prefix' => 'users'), function() { Route::get('users', array('as' => 'getUsers', 'uses' => 'UsersController@getIndex', 'before' => 'hasAccess:users.index')); }); });
В фильтрах:
Route::filter('no-cache',function($route, $request, $response){ $response->headers->set('Cache-Control','nocache, no-store, max-age=0, must-revalidate'); $response->headers->set('Pragma','no-cache'); $response->headers->set('Expires','Fri, 01 Jan 1990 00:00:00 GMT'); });
Да. Как писал @Amelia, эта проблема связана с кешем браузера, но не с Laravel. Отправка ответа без кеша – одно решение, но это не всегда хорошо. Возможно, вам придется заплатить дополнительный хостинг, если вы реализуете это решение.
Я попытался решить эту проблему с помощью некоторого кода javascript в базовом шаблоне перед </body>
.
<script type="text/javascript"> $(document).ready(function() { var isAuth = "<?php echo Auth::check(); ?>"; if (location.href === 'http://local.myapp.in/login/') { if (isAuth) location.href('/home'); } else { if (!isAuth) location.href('/login'); } }); </script>
В приведенном выше коде замените http://local.myapp.in/login/
URL-адрес вашей учетной записи. Поэтому каждый раз, когда страница загружается, этот код запускается. Если пользователь пытается получить доступ к любой ограниченной странице без регистрации, то он будет перенаправлен на страницу входа в систему. И если пользователь пытается получить доступ к странице login
при login
систему, браузер будет перенаправлен на home
страницу.
Так как это код js, даже если страница загружена из кеша браузера, этот фрагмент кода запускается.