Как перенаправить на последнюю посещаемую страницу в приложении 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'))
Но, к сожалению, когда вы делаете это после входа в систему, содержимое, отображаемое на моей странице, дублируется. Любая идея или любое другое безопасное решение?
Ответы
Ответ 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
.