2011-11-02 14 views
5

Ho notato un comportamento strano con redirect quando ho impostato il mio app.context in un determinato modo. Ho trovato un bug nel Grails JIRA che descrive perfettamente il mio problema, ma è stato contrassegnato come UTR: http://jira.grails.org/browse/GRAILS-7546Grails reindirizza all'indirizzo sbagliato quando si utilizza app.context?


Qui è la mia descrizione del problema:
Attualmente sto usando Grails 2.0M2. Ho le seguenti proprietà definite nei miei application.properties presentare:

app.context=/ 
app.name=foobar 

Quando chiamo redirect in un controllore, redirect è l'aggiunta del nome dell'applicazione sul uri fornisco, che poi provoca una 404. ecco come lo sto facendo questo:

String partialUrl = createLink(mapping: 'helloworld') // returns `/hello/world` 
redirect(uri: partialUrl) // INCORRECTLY redirects to 
          // `http://mysite.com/foobar/hello/world` 
          // instead of `http://mysite.com/hello/world` 

Supponiamo che ho una mappatura URL di nome helloworld definito nel mio file UrlMappings.groovy con un percorso di /hello/world.

Quindi, per farla breve, se ho impostato il app.context a /, vorrei NON aspettarsi il app.name di presentarsi nel mio URL di reindirizzamento finale.

Si tratta di un bug o comportamento previsto? Qualche idea sul modo più semplice in cui potrei creare l'URL di reindirizzamento senza fare troppi passaggi manuali?

risposta

0

Non è un problema diretto alla tua domanda, ma la mia pratica è: non applico mai app.context nelle proprietà di grails dato che tomcat lo sovrascrive in produzione e non mi interessa quale contesto usi sul mio dev.

+1

Destra ... Tomcat potrebbe sovrascrivere app.context in produzione, tuttavia il problema rimane comunque il "reindirizzamento" in cui Grails utilizza l'app.name quando crea gli URL di reindirizzamento anziché utilizzare app.context. – Polaris878

1

Odio dirlo, ma non riesco nemmeno a riprodurlo. Ho creato un progetto di test con un controller (chiamato Ciao), utilizzando il codice per creare un'azione che non fa altro che reindirizzare:

HelloController.groovy

package test1 

class HelloController { 
    def index() { 
     def model = [:] 
     model.content = 'content...' 
     model 
    } 

    def redir() { 
     String partialUrl = createLink(mapping: 'helloworld') // returns `/hello/world` 
     redirect(uri: partialUrl) // INCORRECTLY redirects to 
          // `http://mysite.com/foobar/hello/world` 
          // instead of `http://mysite.com/hello/world` 
    } 
} 

ho creato una pagina di indice, in index.gsp il punto di vista/ciao

index.gsp

<h1>index.gsp</h1> 
<html> 
    <body> 
     <p>This data is coming from the model:</p> 
     <p>content: ${content}</p> 
    </body> 
</html> 

Setup HelloWorld nei urlMappings per mappare l'azione index del controller ciao:

UrlMappings.groovy

class UrlMappings { 
    static mappings = { 
     "/helloworld"(controller: "hello", action: "index") 

     "/$controller/$action?/$id?"{ 
      constraints { 
       // apply constraints here 
      } 
     } 

     "/"(view:"/index") 
     "500"(view:'/error') 
    } 
} 

e ha cambiato l'application.properties di avere le app.context =/

application.properties

#Grails Metadata file 
#Sun Nov 06 14:51:56 EST 2011 
app.grails.version=2.0.0.RC1 
app.context=/ 
app.name=test1 
app.servlet.version=2.5 
app.version=0.1 

Quando ho eseguito l'applicazione, ho potuto vai a localhost: 8080/ciao e mostrerebbe il mio semplice GSP. Ho provato localhost: 8080/helloworld e anche ottenuto come previsto per la mappatura. Poi ho provato localhost: 8080/hello/redir e sono stato correttamente reindirizzato a localhost: 8080/helloworld.

Tuttavia, se si sta ancora affrontando questo problema, ho alcuni suggerimenti 1) Prova a utilizzare il nuovo generatore di link disponibile in 2.0 anziché in LinkLink. Potrebbe non fare nulla di diverso, ma vale la pena provare: grailsLinkGenerator.link(mapping: 'helloworld') 2) Se è solo sui reindirizzamenti dai controller, è sufficiente aggiungere la porzione http://mysite.com a partialUrl. 3) Ultima risorsa, scrivi un filtro collegato a afterView che esegue una ricerca regolare e sostituisci i contenuti per mysite.com/foobar. Non sono sicuro che questo colpirà i reindirizzamenti, ma se qualcosa dovesse accadere, presumerei che ciò accadrebbe poiché i filtri possono essere applicati a livello generale.

1
def yourAction = { 

     redirect(uri:"helloworld") 

    } 

Che non funziona per voi?

Problemi correlati