ユーザーセッション
The 4D web server provides built-in features for managing user sessions. ユーザーセッションを作成・維持することで、Webアプリケーション上のユーザーエクスペリエンスを管理・向上することができます。ユーザーセッションが有効かされていると、Webクライアントはリクエスト間で同じコンテキスト (セレクションや変数の値) を再利用できます。
Webサーバーのユーザーセッションでは、以下のことが可能です:
- handle multiple requests simultaneously from the same web client through an unlimited number of preemptive processes (web server sessions are scalable),
- Webクライアントのプロセス間でデータを共有。
- ユーザーセッションに権限を関連付ける。
- handle access through a
Sessionobject and the Session API.
Note: The current implementation is only the first step of an upcoming comprehensive feature allowing developers to manage hierarchical user permissions through sessions in the whole web application.
セッションの有効化
セッション管理機能は、4D Webサーバー上で有効または無効にすることができます。セッション管理を有効化する方法は複数あります:
- ストラクチャー設定の Web / オプション (I) ページの スケーラブルセッション を使用する (永続的な設定):

このオプションは、新規プロジェクトではデフォルトで選択されています。これは、 セッションなし オプションを選択して無効にすることもできます。この場合、Webセッション機能は無効になります (Session オブジェクトは使用できません)。
- Webサーバーオブジェクトの
.scalableSessionプロパティを使用する (.start()関数に settings 引数として渡します)。この場合、ストラクチャー設定ダイアログボックスで定義されたオプションよりも、Webサーバーオブジェクトの設定が優先されます (ディスクには保存されません)。
メインの Webサーバーのセッションモードは、
WEB SET OPTIONコマンドを使って設定することもできます。
いずれの場合も、設定はマシンに対しローカルなものです。 つまり、4D Server の Webサーバーと、リモートの 4Dマシンの Webサーバーで異なる設定が可能です。
互換性について: 4D v18 R6 以前の 4Dバージョンで作成されたプロジェクトでは、旧式セッション オプションが使用できます (詳細については、doc.4d.com の Webサイトを参照ください)。
セッションの実装
セッションを有効にする と、4D自身が設定したプライベート cookie ("4DSID__AppName_"、AppName はアプリケーションプロジェクトの名称) に基づいて、自動メカニズムが実装されます。この cookie は、アプリケーションのカレントWebセッションを参照します。
この cookie の名前は、
.sessionCookieNameプロパティを使用して取得できます。
-
Webサーバーは、各Webクライアントリクエストにおいて、プライベートな "4DSID__AppName_" cookie の存在と値をチェックします。
-
cookie に値がある場合、4D は既存セッションの中からこのクッキーを作成したセッションを探し、見つかった場合には再利用します。
-
クライアントからのリクエストが、すでに開かれているセッションに対応していない場合:
- プライベートな "4DSID__AppName_" cookie を持つ新しいセッションが Webサーバー上に作成されます。
- 新しいゲスト
Sessionオブジェクトが作成され、このスケーラブルWebセッション専用に使用されます。
The current Session object can then be accessed through the Session command in the code of any web processes.

Webプロセスは通常終了せず、効率化のためにプールされリサイクルされます。プロセスがリクエストの実行を終えると、プールに戻され、次のリクエストに対応できるようになります。 Since a web process can be reused by any session, process variables must be cleared by your code at the end of its execution (using CLEAR VARIABLE for example). このクリア処理は、開かれたファイルへの参照など、プロセスに関連するすべての情報に対して必要です。これが、セッション関連の情報を保持したい場合には、Session オブジェクトを使用することが 推奨 される理由です。
情報の共有
各 Session オブジェクトには、共有オブジェクトである .storage プロパティが用意されています。このプロパティにより、セッションで処理されるすべてのプロセス間で情報を共有することができます。
セッションの有効期限
スケーラブルWebセッションは、以下の場合に閉じられます:
- Webサーバーが停止したとき。
- セッションcookie がタイムアウトしたとき。
非アクティブな cookie の有効期限は、デフォルトでは 60分です。 つまり、Webサーバーは、非アクティブなセッションを 60分後に自動的に閉じます。
This timeout can be set using the .idleTimeout property of the Session object (the timeout cannot be less than 60 minutes).
When a scalable web session is closed, if the Session command is called afterwards:
Sessionオブジェクトには権限が含まれていません (ゲストセッション)。.storageプロパティは空です。- 新しいセッションcookie がセッションに関連付けられています。
権限
セッションには、権限を関連付けることができます。セッションの権限に応じて、特定のアクセスや機能を Webサーバー上で提供することができます。
You can assign privileges usign the .setPrivileges() function. コード内では、.hasPrivilege() 関数を使ってセッションの権限をチェックし、アクセスを許可または拒否することができます。 By default, new sessions do not have any privilege: they are guest sessions (.isGuest() function returns true).
現在の実装では (v18 R6)、"WebAdmin" アクセス権のみ利用可能です。
例:
If (Session.hasPrivilege("WebAdmin"))
// アクセス権が付与されているので、何もしません
Else
// 認証ページを表示します
End if
例題
CRMアプリケーションを使って、各営業担当者が自分の顧客ポートフォリオを管理します。データストアには、少なくとも 2つのリンクされたデータクラス Customers と SalesPersons が含まれています (営業担当者は複数の顧客を持ちます)。

営業担当者がログインし、Webサーバー上でセッションを開き、上位3名の顧客をセッションに読み込ませたいとします。
- セッションを開くために以下の URL を実行します:
http://localhost:8044/authenticate.shtml
本番環境では、暗号化されていない情報がネットワーク上を流れるのを防ぐために、HTTPS接続 を使用する必要があります。
authenticate.shtmlページは、userId と password の入力フィールドを含むフォームで、4DACTION の POSTアクションを送信します:
<!DOCTYPE html>
<html>
<body bgcolor="#ffffff">
<FORM ACTION="/4DACTION/authenticate" METHOD=POST>
UserId: <INPUT TYPE=TEXT NAME=userId VALUE=""><br/>
Password: <INPUT TYPE=TEXT NAME=password VALUE=""><br/>
<INPUT TYPE=SUBMIT NAME=OK VALUE="Log In">
</FORM>
</body>
</html>
- authenticate project メソッドは、userID に合致する担当者を探し、SalesPersons テーブルに保存されているハッシュ値をパスワードと照合します。
var $indexUserId; $indexPassword; $userId : Integer
var $password : Text
var $userTop3; $sales; $info : Object
ARRAY TEXT($anames; 0)
ARRAY TEXT($avalues; 0)
WEB GET VARIABLES($anames; $avalues)
$indexUserId:=Find in array($anames; "userId")
$userId:=Num($avalues{$indexUserId})
$indexPassword:=Find in array($anames; "password")
$password:=$avalues{$indexPassword}
$sales:=ds.SalesPersons.query("userId = :1"; $userId).first()
If ($sales#Null)
If (Verify password hash($password; $sales.password))
$info:=New object()
$info.userName:=$sales.firstname+" "+$sales.lastname
Session.setPrivileges($info)
Use (Session.storage)
If (Session.storage.myTop3=Null)
$userTop3:=$sales.customers.orderBy("totalPurchase desc").slice(0; 3)
Session.storage.myTop3:=$userTop3
End if
End use
WEB SEND HTTP REDIRECT("/authenticationOK.shtml")
Else
WEB SEND TEXT("This password is wrong")
End if
Else
WEB SEND TEXT("This userId is unknown")
End if