Laravel Ajax логин, перенаправление на предыдущий URL после успеха - PullRequest
0 голосов
/ 11 июня 2018

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

Ответы [ 8 ]

0 голосов
/ 20 июня 2018

Я решил это, создав скрытое поле в форме, содержащее значение url () -> previous (), потому что иначе я не получал предыдущую страницу, то есть URL-адрес страницы.Я попробовал почти все ответы выше.

0 голосов
/ 18 июня 2018

Если я правильно понимаю вашу проблему, проблема заключается в том, что вы путаете предыдущий URL-адрес для предназначенного URL-адреса, когда вы пытаетесь указать URL-адрес для перенаправления вваш ответ JSON. предыдущий URL фактически ссылается на HTTP Referrer , а не на предполагаемый URL, который устанавливается в сеансе промежуточным программным обеспечением авторизации Laravel.

HTTP реферером является страницакоторый инициирует запрос.Если вы в данный момент находитесь на странице /foo и щелкаете ссылку на страницу /bar, для HTTP Referrer на /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;
0 голосов
/ 18 июня 2018

Laravel 5.4 + поддержка.не знаю для более низкой версии

 return redirect()->back();

Это будет перенаправить на предыдущую страницу, откуда вы пришли.

Ajax part

 <script type="text/javascript">
    var url = "<?php echo url()->previous(); ?>";
    location.href = url;
 </script>

                OR simply javascript function
 history.go(-1);

Проверьте выше и работайте нормально для меня, пожалуйста, проверьте ваш код.

0 голосов
/ 18 июня 2018

Нет необходимости делать что-то особенное для вызовов AJAX.

Перенаправлять так же, как обычно, на внутреннем сервере после отправки формы.

return redirect()->route('dashboard');

На передней панели- и вам просто нужно убедиться, что вы используете перенаправленный URL для изменения window.location.Это приведет к обновлению браузера и переходу на новую страницу.

axios.post(url, formData).then(response => {
    window.location = response.request.responseURL;
});

Этот фрагмент кода предназначен для популярной библиотеки Axios , но то же самое можно сделать с помощью jQuery или vanilla JavaScript..

0 голосов
/ 17 июня 2018

У меня очень похожая проблема: Перенаправление 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()
]);
0 голосов
/ 17 июня 2018

Прежде всего, когда вы получили запрос в бэкэнде, сохраните redirect () -> required ();

required () проверяет, существует ли индекс сеанса url.intended и перенаправляет его наdefault или в противном случае перенаправьте на $ default = '/', который можно перезаписать.

, а затем передайте этот URL при успешном запросе, например:

function testAjax(handleData) {
  $.ajax({
    url:"getvalue.php",  
    success:function(data) {
      window.location.href = data.url;
    }
  });
}
0 голосов
/ 11 июня 2018
URL::previous();

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

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

Удачи !!

0 голосов
/ 11 июня 2018

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

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

используйте

return redirect('dashboard');
...