2009-09-20 13 views
22

Jestem nowicjuszem w Grails i zmagam się z wieloma prostymi problemami.Jak przekierować na ostatnio odwiedzaną stronę w aplikacji Grails?

Na przykład, nie udało mi się znaleźć właściwego sposobu na powrót do ostatnio odwiedzanej strony po zalogowaniu się/wylogowaniu z widoku szablonu, który jest wyświetlany w górnym układzie strony.

Moja ostatnia próba rozwiązania tego problemu polegała na zapisaniu $ {params.controller} i $ {params.action} w parametrach wysłanych do akcji wylogowania i następnie przekierowaniu. Cóż ... nawet to się nie udało. Oto GSP urywek:

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

Ta ostatnia linia kodu rzuca następujący wyjątek:

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

Więc moje pytania to:

1 - Jak mogę przeładować Ostatnio odwiedzone strony po akcja logowania/wylogowania?

2 - Dlaczego mam wyjątek z powyższego kodu?

Dziękuję

EDIT: Odnośnie do pytania nr 2, wydaje się, że następujący kod działa:

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

Ale ja naprawdę nie rozumiem powód ...

EDIT2: Również znalazłem rozwiązanie do przekierowania na ostatnio odwiedzaną stronę:

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

Niestety, gdy robię to po zalogowaniu, zawartość wyświetlana na mojej stronie jest powielana. Jakiś pomysł czy jakiekolwiek inne bezpieczne rozwiązanie?

Odpowiedz

17

Najprostszym sposobem, aby przekierować do ostatniej strony, jest użycie URI bezpośrednio:

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

(request.forwardURI pełna adresem URL wyświetlany w przeglądarce, a request.contextPath jest częścią URL reprezentujący kontekst aplikacji , np. "http://localhost:8080/yourApp" - w ten sposób wynikiem usunięcia ścieżki kontekstowej z przyszłego URI jest względny identyfikator URI aplikacji, np. "/ mycontroller/myaction")

W akcji wylogowania po prostu przekieruj do tego URI:

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

AFAIK, użycie strony wywołującej nie jest całkowicie bezpieczne, ponieważ zależy od agenta użytkownika (przeglądarki) do dołączenia nagłówka HTTP strony odsyłającej (która mogła zostać wyłączona).

Co do drugiego pytania: Grails automatycznie interpretuje wartości atrybutów listy lub mapy w GSP jako wyrażeń Groovy.Tak, to

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

jest równoważna

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

i owijania części tej wypowiedzi ponownie w ${...} wydaje się mylić kompilator GSP.

Mam nadzieję, że to pomoże.

+0

Cześć Daniel, Dziękuję bardzo za aswer. Bardzo mi pomogłeś !! – fabien7474

+0

@ daniel-rinser Twoja odpowiedź wydaje się działać tylko przez pojedyncze odświeżenie. Jak proponujesz obsługi następujących: Page0-> Strona1 Wprowadź dane w postaci w/błędy przekierowany z powrotem do Strona1 z flash.errors Wprowadź dane w formie poprawnie powinien dostać przekierowany z powrotem do Page0 Zamiast wysłane do „/ "jako request.forwardURI()/targetURI jest" " – rik

+1

Dlaczego względny identyfikator URI aplikacji? Jaki jest problem z pełnym adresem URL? –

31

Używam tego kontrolera strony:

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

+1. Proste i łatwe. Twoje zdrowie. :) – TheKojuEffect

+0

bardzo fajnie, dzięki! –

+0

Bardzo przydatne, dzięki – user615274

0

Inną alternatywą jest budowa url z createLink użyciu prądu: actionName, controllerName i params.

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

Spowoduje to utworzenie bezwzględnego adresu URL z powodu absolute:true.

1

W pliku widoku GSP można użyć jako takiego.

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