【現象】
BaseModule、WebPlatform、AppFrameworkでは、以下の条件によりClient.set, Client.get時の挙動が異なります。
・APサーバの種類、設定によりHttpSessionの永続化、復元が行われる場合
・分散環境時におけるロードバランサの設定においてスティッキーセッションが設定されていない場合
これらの条件により、Client APIの挙動が異なります。
以下に例を示します。
----
例1:
Client.set後に、Client.setに受渡した値のプロパティ等を変更した場合
var key = 'key'
var value = {
foo: 'FOO'
};
Client.set(key, value);
// Client.setを呼び出したあとに、value値のプロパティを変更する
value.foo = 'foo'
Client.get(key); // (1)
----
この場合、(1)のタイミングで取得される値は、APサーバの種類、設定により異なる可能性があります。
(1)で取得される値は、Client.set時に受渡した値と同一のインスタンスであるという保証は行われません。 この為、(1)により取得されたオブジェクトのfooプロパティの値は'FOO'または'foo'となる 可能性があります。
Client.setを呼び出した場合、その際に受渡した値は、それ以降不変なオブジェクトとして扱い、プロパティの変更などを行わない処理を記述する事を推奨します。
----
例2:
Client.get後に、Client.getで取得した値のプロパティ等を変更した場合
var key = 'key'
var value = {
foo: 'FOO'
};
Client.set(key, value);
var value2 = Client.get(key); // (1)
value2.foo = 'foo'
Client.get(key); // (2)
----
例1と同様に、(1)で取得される値は、Client.set時に受渡した値と同一のインスタンスであるという保証は行われません。 この為、(2)により取得されたオブジェクトのfooプロパティの値は'FOO'または'foo'となる可能性があります。Client.getを呼び出した場合、その際に取得した値は、それ以降不変なオブジェクトとして扱い、プロパティの変更などを行わない処理を記述する事を推奨します。
上記の例に対し、intra-mart Accel Platformでは、Client.get, Client.setの挙動が 異なります。
intra-mart Accel Platformでは、Client.getにより取得した値は、Client.set時に設定した値と別のインスタンスとなります。従って、Client.get後に取得した値のプロパティ等を変更しても、Client APIに格納されている元の値に影響をあたえることはありません。また、Client.setも同様に、Client.set後に、受渡した値のプロパティを変更しても、Client APIに格納されている値に影響をあたえることはありません。
【対象バージョン】
BaseModule Ver.4.0.x ~ Ver.5.1.x
WebPlatform Ver.6.0.x ~ Ver.7.2.x
AppFramework Ver.6.0.x ~ Ver.7.2.x
intra-mart Accel Platform 2012 Autumn(Alba) ~
※「2013 Autumn」より以下のAPIを提供しています。
Clientオブジェクトとは別に Web Platform ver4.0~ver7.2までの仕様で動作するClient72オブジェクトを提供しています。
APIリスト(http://www.intra-mart.jp/apilist/iap/apilist-ssjs-compatible/doc/compatible/Client72/index.html)
関連要件:要件 [3867] Clientオブジェクトの動作互換対応を行います。
https://issue.intra-mart.jp/issues/3867
-- 対象 ------------------------------------------------------------------------
iAP/Accel Platform/全アップデート
--------------------------------------------------------------------------------
FAQID:11
スクリプト開発モデルのClient APIの挙動が BaseModule、WebPlatform、AppFrameworkの(Ver.7.2.x)以前とintra-mart Accel Platformにおいて異なる場合があります。
