Вход в Laravel Ajax, перенаправление на предыдущий URL-адрес после успеха

Предположим, у меня есть страница 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

Идк, если мой путь верен, но я делаю это совершенно по-другому. Я не использую ajax (), я просто передаю значения, как в сообщении, без ajax, и возвращаю ошибки или перенаправляю ...

user8517929 11.06.2018 12:52

Используйте back () и передайте его как текст

user8517929 11.06.2018 12:56

Ваша проблема решена?

Alihossein shahabi 15.06.2018 22:29

сделайте это с помощью сеанса. всякий раз, когда промежуточное ПО для входа запрещает доступ, вы можете включить его в сеанс с определенным ключом. и всякий раз, когда пользователь успешно вошел в систему, выполните перенаправление на этот маршрут и очистите сеанс.

Amin.Qarabaqi 18.06.2018 08:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
4
5 557
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Это может вам помочь

Вместо этих return redirect()->intended(URL::route('dashboard'));

использовать

return redirect('dashboard');

Я говорю о части запроса AJAX

Waleed 11.06.2018 12:33

Ему необходимо настроить страницу динамически в зависимости от того, где он находился.

Kerel 18.06.2018 11:06
URL::previous();

этот метод поможет вам получить предыдущий URL. и вы можете перенаправить пользователя туда, используя jQuery примерно так:

window.location.href = url; // <- you can try your url here.

Удачи !!

В своем сообщении он заявил, что URL :: previous (); не работает на него. Код jquery для перенаправления работает, но URL-адрес не определен в вашем примере. Из этого ответа непонятно, что он должен делать.

Kerel 18.06.2018 11:08

Прежде всего, когда вы получили запрос в бэкэнде, сохраните 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. Я пробовал почти все ответы выше.

Другие вопросы по теме