سؤال

كيف يمكنني الحصول على الجلسة من داخل كائن أمر؟

لقد حاولت:

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 يعود فارغ بطريقة أو بأخرى ، ولكن الطريقة أعلاه تعمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top