Ahold de la session Obtenez dans l'objet de commande dans Grails
-
03-10-2019 - |
Question
Comment puis-je obtenir la session à partir d'un objet de commande?
J'ai essayé:
import org.springframework.security.context.SecurityContextHolder as SCH
class MyCommand {
def session = RCH.currentRequestAttributes().getSession()
}
lance
java.lang.IllegalStateException: Aucune demande de fil lié trouvé: Vous parlez de la demande en dehors des attributs d'une requête Web réelle, ou le traitement d'une demande en dehors du fil recevant l'origine? Si vous utilisez réellement dans une requête Web et de recevoir ce message, votre code est probablement en cours d'exécution en dehors de DispatcherServlet / DispatcherPortlet. Dans ce cas, l'utilisation ou RequestContextListener RequestContextFilter pour exposer la demande actuelle
La solution
Vous avez une importation pour SecurityContextHolder de Spring Security, mais vous utilisez les Grails standards demandent support. Si vous utilisez le plugin Acegi, puis il y a un filtre qui définit la demande dans un ThreadLocal géré par org.codehaus.groovy.grails.plugins.springsecurity.SecurityRequestHolder, donc cela fonctionnera:
import org.codehaus.groovy.grails.plugins.springsecurity.SecurityRequestHolder as SRH
class MyCommand {
def someMethod() {
def session = SRH.request.session
}
}
Notez que est doit être dans une méthode puisque la classe de commande sera instancié une ou plusieurs fois au démarrage pour l'initialisation, vous devez accéder à la session et de demander que pendant l'exécution d'une requête HTTP
Autres conseils
Il est également possible d'accéder à la session en utilisant RequestContextHolder (pour éviter la dépendance / importation Spring Security):
import org.springframework.web.context.request.RequestContextHolder as RCH
class MyCommand {
def someMethod() {
def session = RCH.requestAttributes.session
}
}
Une autre façon:
import org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest
HttpSession session = GrailsWebRequest.lookup().currentRequest.session
Dans mon application retourne null SecurityRequestHolder.request
en quelque sorte, mais la façon ci-dessus fonctionne.