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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top