Подтвердить что ты не робот

Как перенаправить на последнюю посещаемую страницу в приложении Grails?

Я новичок в Grails, и я борюсь со многими простыми проблемами.

Например, мне не удалось найти правильный способ вернуться на последнюю посещенную страницу при входе в систему/выходе из представления шаблона, которое отображается в верхней части страницы.

Моя последняя попытка решить эту проблему состояла в том, чтобы сохранить параметры ${params.controller} и ${params.action} в параметрах, отправленных в действие выхода из системы, и затем перенаправить их. Ну... даже это не удалось. Вот фрагмент gsp:

<g:link controller="user" action="logout" params="[currentController: ${params.controller}, currentAction: ${params.action}]">Logout</g:link>

Эта последняя строка кода вызывает следующее исключение:

ERROR errors.GrailsExceptionResolver  - Error evaluating expression [[currentController: ${params.controller}, currentAction: ${params.action}]]

Итак, мои вопросы:

1 - Как перезагрузить последнюю посещенную страницу после действия входа/выхода из системы?

2 - Почему у меня есть исключение из моего кода выше?

Спасибо

ИЗМЕНИТЬ: Что касается вопроса № 2, кажется, что работает следующий код:

<g:link controller="user" action="logout" params="[currentController: params.controller, currentAction: params.action]">Logout</g:link>

Но я не совсем понимаю причину...

EDIT2: Я также нашел решение для перенаправления на последнюю посещенную страницу:

redirect(url: request.header('referer'))

Но, к сожалению, когда вы делаете это после входа в систему, содержимое, отображаемое на моей странице, дублируется. Любая идея или любое другое безопасное решение?

4b9b3361

Ответ 1

Самый простой способ перенаправления на последнюю страницу - использовать URI напрямую:

<g:link controller="user" action="logout" params="[targetUri: (request.forwardURI - request.contextPath)]">Logout</g:link>

(request.forwardURI - полный URL-адрес, отображаемый в браузере, а request.contextPath - это часть URL, представляющая контекст приложения, например. http://localhost:8080/yourApp "- таким образом, результатом удаления контекстного пути из прямого URI является относительный URI-приложение, например. /mycontroller/myaction " )

В вашем действии выхода из системы просто переадресовывается на этот URI:

def targetUri = params.targetUri ?: "/"
redirect(uri: targetUri)

AFAIK, используя реферер, не является полностью безопасным, поскольку это зависит от пользовательского агента (браузера), чтобы добавить HTTP-заголовок referrer (который, возможно, был отключен).

Что касается вашего второго вопроса: Grails автоматически интерпретирует значения атрибутов списка или карты в GSP как выражения Groovy. Итак, этот

<g:link controller="user" action="logout" params="[currentController: params.controller, currentAction: params.action]">Logout</g:link>

эквивалентно

<g:link controller="user" action="logout" params="${[currentController: params.controller, currentAction: params.action]}">Logout</g:link>

и обертывание частей этого выражения снова в ${...}, похоже, путает компилятор GSP.

Надеюсь, что это поможет.

Ответ 2

Я использую эту сторону контроллера:

    redirect(uri: request.getHeader('referer') )

Ответ 3

В файле просмотра GSP вы можете использовать как таковой.

<g:link url="${request.getHeader('referer')}"> Back </g:link>

Ответ 4

Другой альтернативой является создание URL с createLink с использованием текущего: actionName, controllerName и params.

<g:link controller="user" action="logout" params="[targetUri: createLink(controller: controllerName, action:actionName, params:params, absolute:true)]">Logout</g:link>

Это создаст абсолютный URL-адрес из-за absolute:true.