احصل على جلسة في كائن القيادة في Grails
-
03-10-2019 - |
سؤال
كيف يمكنني الحصول على الجلسة من داخل كائن أمر؟
لقد حاولت:
import org.springframework.security.context.SecurityContextHolder as SCH
class MyCommand {
def session = RCH.currentRequestAttributes().getSession()
}
هذا يرمي
java.lang.IlegalStateException: لم يتم العثور على طلب مرتبط بخيط: هل تشير إلى سمات الطلب خارج طلب الويب الفعلي ، أو معالجة طلب خارج مؤشر ترابط الاستلام في الأصل؟ إذا كنت تعمل بالفعل ضمن طلب ويب ولا تزال تتلقى هذه الرسالة ، فمن المحتمل أن يتم تشغيل الرمز الخاص بك خارج Dispatcherservlet/DispatcherPortlet: في هذه الحالة ، استخدم requestContextListener أو requestContextFilter لفضح الطلب الحالي.
المحلول
لديك استيراد لـ SecurityContextholder من Surface Security Security ، لكنك تستخدم حامل طلب Grails القياسي. إذا كنت تستخدم المكون الإضافي ACEGI ، فهناك مرشح يحدد الطلب في Threadlocal يديره Org.codehaus.groovy.grails.plugins.springsecurity.securityRequestholder ، لذلك سيعمل: سيعمل:
import org.codehaus.groovy.grails.plugins.springsecurity.SecurityRequestHolder as SRH
class MyCommand {
def someMethod() {
def session = SRH.request.session
}
}
لاحظ أنه يجب أن يكون في طريقة حيث سيتم إنشاء فئة الأوامر مرة واحدة أو أكثر عند بدء التشغيل للتهيئة ، لذلك تحتاج إلى الوصول إلى الجلسة والطلب فقط أثناء تنفيذ طلب HTTP
نصائح أخرى
من الممكن أيضًا الوصول إلى الجلسة باستخدام requestContexTholder (لتجنب التبعية/الاستيراد أمان الربيع):
import org.springframework.web.context.request.RequestContextHolder as RCH
class MyCommand {
def someMethod() {
def session = RCH.requestAttributes.session
}
}
طريق اخر:
import org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest
HttpSession session = GrailsWebRequest.lookup().currentRequest.session
في تطبيقي SecurityRequestHolder.request
يعود فارغ بطريقة أو بأخرى ، ولكن الطريقة أعلاه تعمل.