2009-09-20 13 views
22

Sono un novizio in Grails e sto lottando con molti problemi semplici.Come reindirizzare all'ultima pagina visitata nell'app Grails?

Ad esempio, non sono riuscito a trovare un modo corretto per tornare all'ultima pagina visitata quando eseguo il login/logout da una vista modello che viene visualizzata nel layout superiore della pagina.

Il mio ultimo tentativo di risolvere questo problema è stato di salvare $ {params.controller} e $ {params.action} nei parametri inviati all'azione di disconnessione e successivamente reindirizzare. Beh ... anche questo è fallito. Ecco il frammento di GSP:

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

Questa ultima riga di codice genera la seguente eccezione:

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

Quindi le mie domande sono:

1 - Come posso ricaricare l'ultima pagina visitata dopo un'azione di login/logout?

2 - Perché ho un'eccezione dal mio codice sopra?

Thank You

EDIT: Per quanto riguarda la domanda # 2, sembra che il seguente codice funziona:

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

Ma io non capisco il motivo ...

EDIT2: Ho anche trovato una soluzione per il reindirizzamento all'ultima pagina visitata:

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

Ma sfortunatamente quando si esegue questa operazione dopo l'accesso, i contenuti visualizzati nella mia pagina sono duplicati. Qualche idea o altra soluzione sicura?

risposta

17

Il modo più semplice per reindirizzare l'ultima pagina, è quello di utilizzare direttamente l'URI:

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

(request.forwardURI è l'URL completo come visualizzato nel browser, mentre request.contextPath è la parte dell'URL che rappresenta il contesto app ., ad esempio "http://localhost:8080/yourApp" - in tal modo, il risultato di rimuovere il percorso del contesto dal avanti URI è l'app-URI relativo, ad esempio "/ MyController/myaction")

Nella vostra azione di logout semplicemente reindirizzare a questo URI:.

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

AFAIK, l'utilizzo del referrer non è completamente sicuro, poiché questo si basa sull'agente utente (browser) per aggiungere l'intestazione HTTP del referrer (che potrebbe essere stata disabilitata).

Per quanto riguarda la seconda domanda: Grails interpreta automaticamente i valori di attributo elenco o mappa in GSP come espressioni Groovy.Quindi, questo

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

è equivalente a

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

e confezionamento parti di questa espressione ancora una volta in ${...} sembra confondere il compilatore GSP.

Spero che questo aiuti.

+0

Ciao Daniele, La ringrazio molto per il vostro risponderti. Mi hai aiutato molto !! – fabien7474

+0

@ daniel-rinser La tua risposta sembra funzionare solo attraverso un singolo aggiornamento. Come credi si possa gestire la seguente: Page0-> Pagina1 Inserire i dati in forma w/errori reindirizzato al Pagina1 con flash.errors Inserire i dati in forma correttamente dovrebbe ottenere reindirizzato al Page0 Invece ottenere inviato a '/ 'come request.forwardURI()/targetURI è "" – rik

+1

Perché l'URI relativo dell'app? Qual è il problema con l'Url completo? –

31

sto usando questo controller-side:

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

+1. Semplice e facile. Saluti. :) – TheKojuEffect

+0

molto bello, grazie! –

+0

Abbastanza utile, grazie – user615274

0

Un'altra alternativa è quella di costruire l'url con createLink utilizzando la corrente: actionName, controllerName e params.

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

questo creerà un URL assoluto, a causa della absolute:true.

1

Nel file di visualizzazione GSP è possibile utilizzare come tale.

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