3

コマンドオブジェクト内からセッションを取得するにはどうすればよいですか?

私が試してみました:

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

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

これはスローします

java.lang.IllegalStateException: スレッドにバインドされた要求が見つかりません: 実際の Web 要求の外部で要求属性を参照していますか、または元の受信スレッドの外部で要求を処理していますか? 実際に Web リクエスト内で操作していてもこのメッセージが表示される場合、コードは DispatcherServlet/DispatcherPortlet の外部で実行されている可能性があります。この場合、RequestContextListener または RequestContextFilter を使用して現在のリクエストを公開します。

4

3 に答える 3

5

Spring SecurityのSecurityContextHolderのインポートがありますが、標準のGrailsリクエストホルダーを使用しています。Acegiプラグインを使用している場合は、org.codehaus.groovy.grails.plugins.springsecurity.SecurityRequestHolderによって管理されるThreadLocalにリクエストを設定するフィルターがあるため、これは機能します。

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

コマンドクラスは初期化のために起動時に1回以上インスタンス化されるため、メソッド内にある必要があることに注意してください。したがって、HTTPリクエストの実行中にのみ、セッションにアクセスしてリクエストする必要があります。

于 2010-05-05T22:03:56.793 に答える
2

RequestContextHolder を使用してセッションにアクセスすることもできます (Spring Security の依存関係/インポートを回避するため)。

import org.springframework.web.context.request.RequestContextHolder as RCH
class MyCommand {
   def someMethod() {
       def session = RCH.requestAttributes.session
   }
}
于 2013-11-16T00:43:18.220 に答える