Sapra 'sessione in oggetto di comando in Grails
-
03-10-2019 - |
Domanda
Come posso ottenere la sessione dall'interno di un oggetto comando?
ho provato:
import org.springframework.security.context.SecurityContextHolder as SCH
class MyCommand {
def session = RCH.currentRequestAttributes().getSession()
}
Questo getta ??p>
java.lang.IllegalStateException: Nessuna richiesta filo-bound trovati: Si riferisce alla richiesta attribuisce al di fuori di una richiesta web vero e proprio, o di elaborazione di una richiesta di fuori del filo originariamente riceve? Se in realtà si sta operando all'interno di una richiesta web e continua a ricevere questo messaggio, il codice viene eseguito, probabilmente al di fuori di DispatcherServlet / DispatcherPortlet:. In questo caso, l'uso RequestContextListener o RequestContextFilter per esporre la richiesta corrente
Soluzione
Hai un'importazione per SecurityContextHolder di Primavera di sicurezza, ma si sta utilizzando il Grails standard di richiedere supporto. Se si sta utilizzando il plug-in Acegi, poi c'è un filtro che imposta la richiesta in un ThreadLocal gestito da org.codehaus.groovy.grails.plugins.springsecurity.SecurityRequestHolder, quindi questo funziona:
import org.codehaus.groovy.grails.plugins.springsecurity.SecurityRequestHolder as SRH
class MyCommand {
def someMethod() {
def session = SRH.request.session
}
}
Si noti che è deve essere in un metodo in quanto la classe di comando verrà istanziato una o più volte in fase di avvio per l'inizializzazione, quindi è necessario accedere alla sessione e richiedere solo durante l'esecuzione di una richiesta HTTP
Altri suggerimenti
E 'anche possibile accedere alla sessione utilizzando RequestContextHolder (per evitare la Primavera di sicurezza dipendenza / import):
import org.springframework.web.context.request.RequestContextHolder as RCH
class MyCommand {
def someMethod() {
def session = RCH.requestAttributes.session
}
}
Un altro modo:
import org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest
HttpSession session = GrailsWebRequest.lookup().currentRequest.session
Nella mia app rendimenti SecurityRequestHolder.request
apertura null in qualche modo, ma il modo sopra funziona.