Предположим, у меня есть страница A, на которой используется промежуточное ПО для аутентификации. Из-за отсутствия входа он перенаправляется на страницу входа.
На странице входа у меня есть собственная система входа в систему ajax. При успешном входе в систему я хочу перенаправить на страницу A с тем же URL-адресом, чтобы действие можно было завершить.
Мой код для входа такой:
public function postLogin(Request $request)
{
$auth = false;
$errors = [];
$inputs = $request->all();
$validator = $this->validator($inputs);
if ($validator->fails()) {
return response()->json([
'auth' => false,
'intended' => URL::previous(),
'errors' => $validator->errors()
]);
}
$user = User::where('email', $request->get('email'))->first();
if ($user && $user->is_active == 0) {
$errors[] = "This account has been deactivated";
} else if ($user && $user->confirm_token != null) {
$errors[] = "Please verify your email in order to login";
} else {
$credentials = ['email' => $request->get('email'), 'password' => $request->get('password'), 'is_active' => 1];
if (Auth::attempt($credentials, $request->has('remember'))) {
$auth = true;
} else {
$errors[] = "Email/Password combination not correct";
}
}
if ($request->ajax()) {
return response()->json([
'auth' => $auth,
'intended' => URL::previous(),
'errors' => $errors
]);
}
return redirect()->intended(URL::route('dashboard'));
}
Я пытаюсь получить предыдущий URL-адрес через url () -> previous (), но он возвращает URL-адрес страницы входа. Может ли кто-нибудь помочь мне в этом, пожалуйста. Будем признательны за любые улучшения / помощь.
Я использую Laravel 5.4
Используйте back () и передайте его как текст
Ваша проблема решена?
сделайте это с помощью сеанса. всякий раз, когда промежуточное ПО для входа запрещает доступ, вы можете включить его в сеанс с определенным ключом. и всякий раз, когда пользователь успешно вошел в систему, выполните перенаправление на этот маршрут и очистите сеанс.





Это может вам помочь
Вместо этих return redirect()->intended(URL::route('dashboard'));
использовать
return redirect('dashboard');
Я говорю о части запроса AJAX
Ему необходимо настроить страницу динамически в зависимости от того, где он находился.
URL::previous();
этот метод поможет вам получить предыдущий URL. и вы можете перенаправить пользователя туда, используя jQuery примерно так:
window.location.href = url; // <- you can try your url here.
Удачи !!
В своем сообщении он заявил, что URL :: previous (); не работает на него. Код jquery для перенаправления работает, но URL-адрес не определен в вашем примере. Из этого ответа непонятно, что он должен делать.
Прежде всего, когда вы получили запрос в бэкэнде, сохраните redirect () -> назначенный ();
intended() checks if the session index url.intended exists and redirects to it by default or else redirect to $default='/' which can be overwritten.
затем передайте этот URL-адрес при успешном запросе, например:
function testAjax(handleData) {
$.ajax({
url:"getvalue.php",
success:function(data) {
window.location.href = data.url;
}
});
}
У меня здесь очень похожая проблема: Перенаправление Ajax Auth на Laravel 5.6
Как отметил @aimme (https://stackoverflow.com/users/1409707/aimme), вызовы Ajax не имеют состояния, поэтому в основном вы не можете взаимодействовать с бэкэндом.
Его предложение и мое предложение - передать URL-адрес страницы, на которую нужно перенаправить, или, может быть, в вашем случае вы могли бы перейти к ней через параметры публикации, например:
return response()->json([
'auth' => false,
'intended' => $request->intended,
'errors' => $validator->errors()
]);
Для вызовов AJAX нет необходимости делать что-то особенное.
Перенаправляйте так же, как вы обычно делаете это на серверной части после отправки формы.
return redirect()->route('dashboard');
Во внешнем интерфейсе вам просто нужно убедиться, что вы используете перенаправленный URL-адрес для изменения window.location. Это заставит браузер обновиться и перейти на новую страницу.
axios.post(url, formData).then(response => {
window.location = response.request.responseURL;
});
Этот фрагмент кода предназначен для популярной библиотеки Axios, но то же самое можно сделать с помощью jQuery или ванильного JavaScript.
Если я правильно понимаю вашу проблему, проблема в том, что вы путаете URL-адрес предыдущий с URL-адресом намеревался, когда пытаетесь указать URL-адрес для перенаправления в своем ответе JSON. URL-адрес предыдущий фактически относится к HTTP-реферер, а не к предполагаемому URL-адресу, который устанавливается в сеансе промежуточным программным обеспечением Laravel auth.
HTTP-реферер - это страница, которая инициирует запрос. Если вы в настоящее время находитесь на странице /foo и щелкаете ссылку на страницу /bar, HTTP-реферером на /bar будет /foo. То же самое происходит, когда вы инициируете запрос AJAX, страница, на которой вы находитесь, будет реферером конечной точки, на которую вы попадаете. В вашем случае ваша страница входа инициирует запрос к вашему обработчику входа через AJAX.
Когда вы пытаетесь посетить страницу, защищенную средой аутентификации Laravel, именно в этот момент Laravel устанавливает значение для URL-адреса намеревался в сеансе, прежде чем перенаправить вас на страницу входа. Laravel хранит URL-адрес намеревался в сеансе как url.intended (как вы можете видеть в Illuminate\Routing\Redirector::intended, это то, что вызывает redirect()->intended()). Так что все, что вам нужно сделать, это взять это из сеанса.
if ($request->ajax()) {
return response()->json([
'auth' => $auth,
'intended' => session()->pull('url.intended') ?: URL::route('dashboard'),
'errors' => $errors
]);
}
return redirect()->intended(URL::route('dashboard'));
Примечание: Использование ->pull удалит элемент из сеанса после того, как он был получен.
Более простой способ сделать это - просто получить целевой URL из предполагаемого RedirectResponse:
$redirect = redirect()->intended(URL::route('dashboard'))
if ($request->ajax()) {
return response()->json([
'auth' => $auth,
'intended' => $redirect->getTargetUrl(),
'errors' => $errors
]);
}
return $redirect;
Поддержка Laravel 5.4 +. не знаю для более низкой версии
return redirect()->back();
Это приведет к перенаправлению на предыдущую страницу, с которой вы пришли.
Часть Ajax
<script type = "text/javascript">
var url = "<?php echo url()->previous(); ?>";
location.href = url;
</script>
OR simply javascript function
history.go(-1);
Проверьте вышеуказанное, и у меня все работает нормально, пожалуйста, проверьте свой код.
Я решил это, создав скрытое поле в форме, содержащее значение url () -> previous (), потому что другим способом я не получал предыдущую страницу, то есть URL-адрес страницы A. Я пробовал почти все ответы выше.
Идк, если мой путь верен, но я делаю это совершенно по-другому. Я не использую ajax (), я просто передаю значения, как в сообщении, без ajax, и возвращаю ошибки или перенаправляю ...