Frage

Wie kann ich die Sitzung innerhalb eines Befehls Objekt erhalten?

Ich habe versucht:

import org.springframework.security.context.SecurityContextHolder as SCH

class MyCommand {
   def session = RCH.currentRequestAttributes().getSession()
}

Dies wirft

java.lang.IllegalStateException: Nein gewinde gebunden Anfrage gefunden: Sie Anfrage beziehen, sind Attribute außerhalb einer tatsächlichen Web-Anfrage, oder die Bearbeitung einer Anfrage außerhalb des ursprünglich Aufnahmegewindes? Wenn Sie tatsächlich innerhalb einer Web-Anfrage arbeiten und erhalten diese Meldung, Ihr Code wahrscheinlich läuft außerhalb von DispatcherServlet / DispatcherPortlet. In diesem Fall Gebrauch RequestContextListener oder RequestContextFilter die aktuelle Anforderung zu belichten

War es hilfreich?

Lösung

Sie haben einen Import für Spring Security ist SecurityContextHolder aber Sie verwenden die Standard-Grails Inhaber verlangen. Wenn Sie das Acegi Plugin verwenden, dann gibt es einen Filter, setzt die Anforderung in einem Thread von org.codehaus.groovy.grails.plugins.springsecurity.SecurityRequestHolder verwaltet werden, so dass dies funktioniert:

import org.codehaus.groovy.grails.plugins.springsecurity.SecurityRequestHolder as SRH
class MyCommand {
   def someMethod() {
      def session = SRH.request.session
   }
}

Beachten Sie, dass hat, ist in einem Verfahren sein, da der Befehl Klasse ein oder mehr Male beim Start zur Initialisierung instanziert werden, so dass Sie die Sitzung zugreifen müssen und fordern nur während der Ausführung einer HTTP-Anforderung

Andere Tipps

Es ist auch möglich, die Sitzung mit RequestContextHolder zuzugreifen (die Spring Security Abhängigkeit / Import zu vermeiden):

import org.springframework.web.context.request.RequestContextHolder as RCH
class MyCommand {
   def someMethod() {
       def session = RCH.requestAttributes.session
   }
}

Eine andere Möglichkeit:

import org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest
HttpSession session = GrailsWebRequest.lookup().currentRequest.session

In meinem app SecurityRequestHolder.request gibt null zurück, irgendwie, aber die Art und Weise oben funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top