問題
-
SEO上、自分のウェブサイトの情報を追跡する必要があります。
そのためにワークフローにgroovyスクリプトを挿入し、ユーザーセッションを取得していますが、セッションIDはnullを返します。 -
再現の手順:
1. workflow_for_testing.txt に添付されたソースからワークフローを作成する。
2. Contents&Dataに新しいフォームを作成し、そのワークフローに割り当てる。
3.
4. そのページに行き、フォームを一度送信する。
結果:以下のようなログが表示される。セッションはNULLではありません!HttpSessionAdaptor[com.liferay.util.servlet.NullSession#nctk, equinox.http.dynamic-data-mapping-form-web]。
5.
結果:「通常の」セッションIDが記録されました。セッションはNULLではありません!HttpSessionAdaptor[D46098C43B9A32517696BB5B4D7D7733, equinox.http.dynamic-data-mapping-form-web]。
それ以降の送信はすべて、実際のセッションIDを記録しているようだ。 (場合によってはヌルも)
環境
- 7.4
解像度
-
groovyスクリプトが実行されるとき ここでこの新しいスレッドでは、セッションは
ヌル - これはおそらく、HttpSessionがスレッドセーフではないことに関係していると思われる。https://stackoverflow.com/questions/10473254/accessing-httpsession-outside-of-the-originally-receiving-threadを参照。
「HttpSessionオブジェクト自体は複数のスレッドで使用することができます (ただしスレッドセーフではないため、同期する必要があります)…。 Asyncメソッドで必要なセッション属性を抽出し、直接渡す。"
-
もし
モデルのリスナーモデル・リスナーを作成できればPortalSessionThreadLocal.getHttpSession()を使ってこれらの属性を抽出できます:
public class DDMFormInstanceRecordModelListener
extends BaseModelListener<DDMFormInstanceRecord> {
@Override
public void onBeforeCreate(DDMFormInstanceRecord ddmFormInstanceRecord) throws ModelListenerException {
HttpSession httpSession = PortalSessionThreadLocal.getHttpSession();
}
}
注意PortalSessionThreadLocal.getHttpSession()はを返します。を返します。