Erhalten Sie Ahold Sitzung in Befehlsobjekt in Grails
-
03-10-2019 - |
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
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.