Как перенаправить на последнюю посещенную страницу в приложении Grails? - PullRequest
25 голосов
/ 20 сентября 2009

Я новичок в 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'))

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

Ответы [ 4 ]

36 голосов
/ 14 сентября 2013

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

    redirect(uri: request.getHeader('referer') )
17 голосов
/ 22 сентября 2009

Самый простой способ перенаправить на последнюю страницу, это использовать 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-заголовок реферера (который мог быть отключен).

Что касается вашего второго вопроса: 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.

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

3 голосов
/ 13 сентября 2016

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

<g:link url="${request.getHeader('referer')}"> Back </g:link>
0 голосов
/ 30 апреля 2015

Другой альтернативой является создание 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...