Grailsのコマンドオブジェクトのセッションを把握する
-
03-10-2019 - |
質問
コマンドオブジェクト内からセッションを取得するにはどうすればよいですか?
私が試してみました:
import org.springframework.security.context.SecurityContextHolder as SCH
class MyCommand {
def session = RCH.currentRequestAttributes().getSession()
}
これは投げます
java.lang.IllegalStateException:スレッドバインドされたリクエストが見つかりません:実際の Web リクエストの外部のリクエスト属性を参照しているのでしょうか、それとも最初に受信したスレッドの外部でリクエストを処理していますか?実際に Web リクエスト内で操作していてもこのメッセージが表示される場合は、コードが DispatcherServlet/DispatcherPortlet の外部で実行されている可能性があります。この場合、RequestContextListener または RequestContextFilter を使用して現在のリクエストを公開します。
解決
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 リクエストの実行中にのみセッションとリクエストにアクセスする必要があります。
他のヒント
RequestContextHolder を使用してセッションにアクセスすることもできます (Spring Security の依存関係/インポートを回避するため)。
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
どういうわけかnullを返しますが、上記の方法は機能します。