2015-10-20 7 views
6

Sto riscontrando un comportamento strano nella mia applicazione Spring MVC 3.2 e ho notato che ciò accade solo quando il reindirizzamento viene eseguito in modo alternativo; Quindi le mie domande sono:In Spring MVC, l'uso di "redirect: process" o "redirect:/process" differisce a causa della perdita di una sessione o di un valore di sessione?

  1. sta facendo 'redirect:/processo' qualsiasi diversa da 'reindirizzamento: processo' per il reindirizzamento a un controller interno?

    La barra aggiunta fa alcuna differenza, ad esempio influire sulla gestione della sessione?

  2. Quali sono i motivi di una sessione persa (o degli attributi di sessione persi)?

    C'è un valore che ho letto attraverso la mia applicazione; anche tu reindirizza in molti casi, quando aggiungo una barra prima dell'URI del controller, sulla produzione a volte sto perdendo questo valore.

    Qualsiasi indizio su come risolvere il valore della sessione persa?

Nota: Sto usando metodi httpRequest.getSession().setAttribute e httpSession.getAttribute per l'accesso alla sessione.

+0

Stacktrace? Errore? Codice che causa l'errore? –

+0

Ricevo una NullPointerException a causa del valore che sto recuperando dalla sessione come null. Questo accade circa una dozzina di volte nel corso della giornata. –

+0

Questo succede in un metodo GET controller, quando ritorna (come il nome della vista) valore 'redirect:/process'. Nota, non posso riprodurlo localmente. –

risposta

0

Solo una nota: / è una barra, il backslash è \.

Fatta eccezione per cause esterne a causa di altri errori, né redirect:process non redirect:/process dovrebbe cambiare nulla per quanto riguarda la sessione.

Ma questi 2 reindirizzamenti sono non supposti per fare la stessa cosa, a meno che non si sia nella pagina dell'applicazione di root. Supponendo che l'applicazione venga eseguita sulla porta HTTP 80 su server.domain, con un contesto servlet di myapp, e si sta elaborando una richiesta a http://server.domain/myapp/local/part, redirect:process chiederebbe al browser di richiedere http://server.domain/myapp/local/part/process, quando redirect:/process chiederebbe al browser di richiedere http://server.domain/myapp/process.

Cosa succede dopo dipende dai mapping del controller.

+0

Questo è terribilmente strano allora. Ricevo una risposta su un URI del controller 'http: // dominio/app/risultato', ma eseguo il 'reindirizzamento: processo' Sto colpendo il controller che ha richiesto il processo 'processo' (e non 'risultato/processo'). In base alla descrizione, questo non dovrebbe essere possibile –

+0

Il valore di @RequestMapping per il controller "/process.htm"? In tal caso, hai provato a utilizzare "redirect: /process.htm"? – QuestionMarks

+0

No, non c'è il suffisso '.htm', sto raggiungendo il mio controller corretto, ma perdendo sessioni, sia che eseguo 'reindirizza: process' o 'reindirizza:/proceess' è lo stesso. –

1

con '/' si sta dichiarando un percorso da root, che è il percorso di contesto del servlet. senza '/', di solito sta andando a un percorso relativo al tuo sottotitolo corrente. per esempio, se sei in '/ go/url', stai indicando '/ go/url/next', non '/ next'.

Non ho controllato il codice sorgente di primavera ma di solito funziona nel browser.

EDIT:

Mi dispiace, in Spring MVC, è necessario sempre fornire il percorso completo, non solo percorso relativo. Quindi dovresti fare "redirect:/full/path".

+0

Esatto, e sto utilizzando un percorso che inizia con "/" ora, tutto bene. Tuttavia non ho visto come la tua risposta sia rilevante per quanto riguarda le sessioni perse. –

+0

Probabilmente vuoi ricontrollare il valore che stai impostando non è nullo in primo luogo ... –

0

Probabilmente si desidera analizzare, qual è la causa degli attributi della sessione persa. Un approccio sarebbe quello di implementare il proprio HttpSessionAttributeListener e accedere all'implementazione public void attributeRemoved(HttpSessionBindingEvent event).Mantenere anche il livello di log primaverile per il debug.

+0

Grazie, tuttavia, non riesco a utilizzare Debug in produzione e questo non è ancora stato riprodotto localmente. Quindi implementerò ciò che hai menzionato e vedrò cosa sta succedendo. –

Problemi correlati