Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

CSP での HTTP 要求

CSP は、受信した HTTP (Hypertext Transport Protocol) 要求に応答して、動的なコンテンツを提供します。この章では、CSP で HTTP がどのように処理されるかという点について基本的な内容を説明します。

HTTP は、クライアントがサーバへ要求を送る単純なプロトコルです。HTTP はステートレス方式のプロトコルです。つまり、クライアントとサーバ間は、要求のやりとりに必要な間のみ接続されます。すべての HTTP 要求には、要求のタイプ (GET や POST など)、URL、およびバージョン・ナンバーを指定する要求ヘッダが含まれています。また、付加情報が含まれることもあります。CSP はどの HTTP 要求を処理すべきかを自動的に決定し、それを Caché サーバ内の適切なクラスへ配信し、要求の情報を使用しやすいオブジェクトにまとめます (%CSP.RequestOpens in a new tab オブジェクトなど)。

CSP 実行時環境

以下の図は、CSP と HTTP 要求のアーキテクチャを表しています。

CSP アーキテクチャ
generated description: 3tier

CSP アプリケーションの実行時環境は、以下のとおりです。

  • HTTP クライアント (Web ブラウザなど)

  • HTTP サーバ (Apache や IIS などの Web サーバ)

  • CSP ゲートウェイ (Web サーバへの Caché アド・オン)

  • Caché サーバ (要求された CSP アプリケーションを CSP サーバで実行する場所となるサーバ)

HTTP 要求の処理

以下の図は、CSP が HTTP 要求を処理するときの、イベントのフローを表しています。

HTTP イベント・フロー
generated description: httprequest
  1. ブラウザ (または同様の Web クライアント) が、HTTP 要求を行います。

  2. Web サーバは、これが CSP 要求であると判断し、その要求を Web サーバにインストールされている CSP ゲートウェイに送信します。2a Web サーバは、アプリケーション構成によっては、静的コンテンツを処理する場合があります。

  3. CSP ゲートウェイは、その要求を再度まとめて、適切な Caché サーバに送信します。

  4. Caché サーバは、メッセージをデコードし、要求が静的ページに対してであるか、それとも CSP クラスに対してであるかを判断します。

    .html.jpg などの静的ファイルに対する要求であれば、Caché サーバはローカル・ファイル・システムでそのファイルを見つけ、そのコンテンツをクライアントに返信します。(Unicode テキストを含むファイルを扱う場合、CSP は BOM を用いることで使用に適したエンコードを判断します。そのため、BOM が Unicode テキスト・ファイル内に存在する必要があります。)

    クラスに対する要求であれば、アプリケーションを構成するイベント処理クラスのうち、どのクラスでイベントを処理するかを決定し、そのクラスの Page メソッドを呼び出します。

  5. Page メソッドの出力または静的ページが、HTTP 応答として CSP ゲートウェイに返送されます。

  6. CSP ゲートウェイは HTTP の応答を Web サーバに渡します (具体的には、応答は CSP ゲートウェイを経由して、Web サーバへ返送されます)。

  7. Web サーバは Web ブラウザに応答を返し、Web ブラウザがその応答を処理します。HTML の場合はその内容が表示されます。

Web サーバと CSP ゲートウェイ

Web ブラウザなどの HTTP クライアントが Web サーバにメッセージを送信すると、HTTP 要求が始まります。CSP ゲートウェイは、DLL または共有ライブラリであり、Web サーバ (IIS、Apache など) が特定の種類のイベントを処理するために使用します。CSP ゲートウェイは、以下の条件に当てはまる場合に HTTP 要求を処理します。

  • URL のディレクトリ・パスに、Web サーバで定義された正当なアクセス権が設定されていること。

CSP ゲートウェイは、以下の機能を提供します。

  1. 実行する処理を必要最小限に抑え、その処理のほとんどを Caché CSP サーバで実行することにより、Web サーバで使用できるリソースを増やします。

  2. 指定された CSP サーバへの接続プールを維持します。

  3. フェイルオーバー・オプションにより、CSP サーバを多数連結して使用することができます。

CSP サーバ

CSP サーバは、CSP ゲートウェイからの要求を処理する、Caché サーバ上で稼動するプロセスです。各 Caché サーバは、マシンの種類によって発生する制約の範囲内で、必要な数の CSP サーバ・プロセスを実行できます。この場合、CSP サーバはライセンスの対象台数に算入されません。

ステートレス で要求を処理する場合は、多数の異なるクライアントからの要求を各 CSP サーバ・プロセスでサポートできます。ステート・プリザービング・モードでは、そのモードが解除されない限り、1 つのプロセスが 1 つのクライアントからの要求処理に専有されます。

Note:

Caché では、アプリケーション・サーバデータ・サーバに実質的な違いがないことが重要な利点です。これにより、要求を処理するうえで必要な台数のマシンを使用するようにアプリケーションを構成できます。これはアプリケーションの論理やデータベース・スキーマとは無関係に実行できます。特定のシステムが、アプリケーション・サーバかデータ・サーバか (あるいは両方) は、構成の問題です。

CSP サーバのイベント・フロー

CSP サーバは、CSP ゲートウェイから要求を受信すると、要求が静的ページに対してであるか、それとも CSP クラスに対してであるかを判断します。静的ページに対する要求の場合は、直ちにページを返信します。CSP クラスに対する要求の場合は、以下を実行します。

  1. 要求がどのセッションに属するかを決定します。いずれのセッションにも属さない場合は、新規セッションを開始します。

  2. 要求が Caché の正しいネームスペースで処理されたことを確認します。

  3. 正しい %CSP.SessionOpens in a new tab オブジェクトが有効であることを確認し、HTTP 要求に含まれた情報を基に、%CSP.RequestOpens in a new tab オブジェクトのインスタンスを生成します。必要に応じて、暗号化します。

  4. %CSP.Response オブジェクトを作成し、アプリケーションで応答ヘッダを変更できるようにします。

  5. 要求を処理するクラスを判断し、その Page メソッドを呼び出します。このメソッドは、OnPage コールバック・メソッドを呼び出します。

CSP サーバの URL とクラス名の解決

CSP サーバは、URL を解読して、どのクラスに HTTP 要求を配信するかを決定します。CSP は URL を以下の構成要素に分解します。

URL: http://localhost:[<port_no>]/csp/samples/object.csp?OBJID=2

URL の構成要素
構成要素 目的
http:// プロトコル
localhost Web サーバのアドレス
[<port_no>] 必要に応じ、Web サーバが稼動しているポート番号を指定します。既定のポート番号は 80 です。
/csp/samples/ ディレクトリ
object.csp ファイル名と拡張子
?OBJID=2 クエリ

プロトコルとサーバ・アドレスは Web サーバが処理し、CSP サーバは関与しません。ディレクトリは、URL が参照する CSP アプリケーション を指定するために利用します。すべての Caché 構成は、多数の CSP アプリケーションを定義することができます。URL のディレクトリ部分により、これらを識別します。管理ポータルの [ウェブアプリケーション] ページ (システム, セキュリティ, ウェブアプリケーション) で作成および変更できる各 CSP アプリケーションでは、すべての要求によって使用されるさまざまな設定を、所定の URL ディレクトリで指定します。これらの中で最も重要なものは、要求が実行される Caché ネームスペースと、確立可能なアプリケーションへの接続の種類を指定する認証メカニズムです。

要求を処理するクラスの名前は、そのファイル名から以下のアルゴリズムを使用して、CSP アプリケーションに基づいて決定されます。

  • ファイル拡張子が .cls の場合、そのファイル名をクラス名とします。

  • ファイル拡張子が .csp の場合、パッケージ名として csp (または構成内で指定されたパッケージ名)、クラス名としてファイル名を使用してクラス名を作成します。このクラスが存在しない場合や、期限切れの場合、autocompile がオンになっていれば、CSP コンパイラは CSP ソース・ファイルからクラスを作成します。このファイルは、URL と同じ名前と拡張子を持ちます。

例えば、CSP サーバが以下の URL を配信するとします。

http://localhost:57772/csp/samples/menu.csp

配信先は、ディレクトリ /csp/samples に関連付けられた Caché ネームスペース (この場合、SAMPLES ネームスペース) で実行されている csp パッケージにある menu というクラスです。

URL ディレクトリ /csp/accounting が Caché ネームスペース ACCOUNTING に関連付けられている場合、CSP サーバは以下の URL を配信します。

http://localhost:57772/csp/accounting/Ledger.csp

配信先は、Caché ネームスペース ACCOUNTING で実行されている csp パッケージにある ledger というクラスです。

CSP で使用する URL ファイル名には、以下のような制限があることに注意してください。

  • 有効な Caché クラス名を指定する必要があります。ドットとパーセント文字 (%25) を除く句読点やスペースは使用できません。また、先頭には数字を使用できません。

  • 既に使用中のクラス名は使用できません。

Note:

定義されたディレクトリのサブディレクトリ内に .csp ファイルが配置されている場合、サブディレクトリ名はそのページに使用される %CSP.PageOpens in a new tab クラスのパッケージ名の一部になります。例えば、URL ディレクトリ /csp/samples が CSP アプリケーションとして定義されている場合、/csp/ samples/myapp/page.cspcsp.myapp.page というクラスを参照します。

%CSP.Page クラス

CSP サーバでは、すべての HTTP 要求は、%CSP.PageOpens in a new tab クラスによって定義されたさまざまなメソッドを呼び出すことにより処理されます。しかし、%CSP.PageOpens in a new tab クラスは HTTP 要求の処理に必要なインタフェースを定義するだけで、直接的には処理を実行しません。実際のイベント処理は、%CSP.PageOpens in a new tab のサブクラスにより実行されます (このサブクラスは、手動で生成するか、CSP ソース・ファイルを処理した結果として生成されます)。

%CSP.PageOpens in a new tab のサブクラスはインスタンスを作成しないため、%CSP.PageOpens in a new tab オブジェクトも生成されません。%CSP.PageOpens in a new tab によって定義されたメソッドは、すべてクラス・メソッドであり、呼び出しにオブジェクトは必要ありません。これらのメソッドに必要なステート情報は、CSP サーバが管理する他のオブジェクト (%CSP.RequestOpens in a new tab%CSP.SessionOpens in a new tab オブジェクトなど) により供給されます。

Page メソッド

要求を処理する %CSP.PageOpens in a new tab クラスを決定した CSP サーバは、適切な処理コンテキストを作成し、そのクラスの Page メソッドを呼び出します。処理コンテキストの設定では、すべての出力が Write コマンドを使用して HTTP クライアントに返送されるように標準出力デバイス ($IO) にリダイレクトを設定し、要求されたすべてのオブジェクト (%request%response%session などのオブジェクト) のインスタンスやローカル変数を作成します。

Page メソッドは、HTTP 要求に対する完全な応答処理を実行します。これには、コールバック・メソッド OnPreHTTPOnPageOnPostHTTP を、この順番で呼び出します。サブクラスではこれらのメソッドをオーバーライドして独自の動作を実現できるので、これらのメソッドはコールバック・メソッドとして参照されます。

OnPreHTTP メソッドは、HTTP 応答のヘッダを書き出す処理を担当します。このヘッダには、コンテンツ・タイプや cookie などの情報が含まれます。既定の動作は、コンテンツ・タイプの設定を text/html とします。一般的には、OnPreHTTP メソッドをオーバーライドする必要があるのは、応答ヘッダを直接管理する必要がある場合のみです。

OnPage メソッドは、HTTP 要求への応答処理において、最も重要な作業を実行します。HTML ドキュメントや XML ドキュメントなど、要求の本文を書き出す処理を担当します。

以下は、OnPage メソッドを使用したサンプル CSP クラスの例です。

Class MyApp.Page Extends %CSP.Page
{
ClassMethod OnPage() As %Status
{
    Write "<html>",!
    Write "<body>",!
    Write "My page",!
    Write "</body>",!
    Write "</html>",!
    Quit $$$OK
}
}

OnPostHTTP メソッドは、HTTP 要求の処理が終了した後に作業をする場合に利用できます。

%CSP.Page クラス・パラメータ

%CSP.PageOpens in a new tab クラスには、オーバーライドできるクラス・パラメータがあります。これらを使用して、コードを記述しなくても動作をカスタマイズできます。

使用可能なすべてのクラス・パラメータのリストについては、%CSP.PageOpens in a new tab のドキュメントを参照してください。

プログラミングによってアプリケーション開発をしている場合は、これらのクラス・パラメータは (例えば、スタジオ内のクラス・エディタを使用して) 作成された %CSP.PageOpens in a new tab のサブクラス内でオーバーライドすることができます。

また、ページの作成に .csp ファイルを使用している場合は、csp:class タグを使用してこれらのパラメータ値を設定できます。

<csp:class PRIVATE="1">
リソースによるページへのアクセスの制限

CSP ページへのアクセスを制限するには SECURITYRESOURCE パラメータを使用します。SECURITYRESOURCE は、システム・リソースとそれに関連付けた権限のコンマ区切りリストをとります。 垂直バー (|) を使用して OR 条件を指定でき、コンマ (,) を使用して AND 条件を指定できます。 このページを表示するユーザまたはこのページのサーバ側メソッドをクライアントから呼び出すユーザは、指定のリソースに対して、このパラメータで指定されているすべての権限を保持している必要があります。

このリストの各項目では以下の形式を使用します。

Resource[:Permission]

Resource は、このシステムに設定されている任意のリソースです (リソースのリストは、システム, セキュリティ管理, リソース を参照してください)。

Permission は USE、READ、または WRITE のいずれかです。これは省略できますが、既定は USE です。

R1,R2|R3,R3|R4

この例では、リソース R1、リソース R2 または R3、およびリソース R3 または R4 がユーザに必要であることを示しています。R1 と R3 を有するユーザは、このページを実行できます。R1 と R4 を有するユーザは、「R2 または R3」の条件を満足しないので、このページを実行できません。垂直バー (|) で記述した OR 条件は、コンマ (,) で記述した AND 条件よりも優先されます。

CSP エラーの処理

%CSP.ErrorOpens in a new tab は、既定の CSP エラー・ページです。作成するエラーページのスーパークラスとしてこれを使用します。%CSP.ErrorOpens in a new tab で提供される関数を使用してエラーから情報を引き出すことができます。

ライセンスが付与される前の CSP エラーの処理

既に既存のセッションがあり、見つからないページにユーザが移動しようとした場合、このセッションには既にライセンスがあるので、CSP は、標準エラー・ページを表示します。

CSP アプリケーションにはまだライセンスがなく、以下のいずれかのエラーが発生した場合、CSP は、既定で標準の Web エラー・メッセージ「HTTP/1.1 404 ページが見つかりません」を表示します。 アプリケーションのエラー・ページ (通常、%CSP.ErrorOpens in a new tab のサブクラス) で以下のパラメータを設定することによって、ライセンスが付与される前にエラーが発生した場合に表示されるページを変更できます。

LICENSEERRORPAGE

以下のエラーが発生した場合、CSP は、LICENSEERRORPAGE パラメータの値を確認します。

Cannot grant license.

LICENSEERRORPAGE には、以下の 2 つの値を指定できます。

"" — 「HTTP/1.1 404 ページが見つかりません」というエラーを返します (既定)。

静的 HTML ページへのパス /csp/samples/static.html などの名前がつけられた静的ページを表示します。

PAGENOTFOUNDERRORPAGE

以下のいずれかのエラーが発生した場合、CSP は、PAGENOTFOUNDERRORPAGE パラメータの値を確認します。

Class does not exist
Method does not exist
CSP application does not exist (set parameter on default error page)
CSP page does not exist
File does not exist
CSP namespace does not exist
CSP illegal request
File cannot open
CSP session timeout 

PAGENOTFOUNDERRORPAGE には、以下の 3 つの値を指定できます。

"" — 「HTTP/1.1 404 ページが見つかりません」というエラーを返します (既定)。

1 — ライセンスを取得し、標準エラー・ページを表示します。

静的 HTML ページへのパス /csp/samples/static.html などの名前がつけられた静的ページを表示します。

OTHERSTATICERRORPAGE

その他のエラーが発生した場合、CSP は、OTHERSTATICERRORPAGE パラメータの値を確認します。

OTHERSTATICERRORPAGE には、以下の 3 つの値を指定できます。

"" — ライセンスを取得し、標準エラー・ページを表示します (既定)。

1 — 「404 ページが見つかりません」というエラーを出力します。ライセンスは必要ありません。

静的 HTML ページへのパス /csp/samples/static.html などの名前がつけられた静的ページを表示します。

%CSP.Request オブジェクト

CSP サーバが HTTP 要求に応答する際、CSP サーバは受信した要求についての情報を %CSP.RequestOpens in a new tab オブジェクトのインスタンスにまとめます。変数 %request を使用して、このオブジェクトを参照できます。プロパティやメソッドの全リストについては、%CSP.RequestOpens in a new tab クラスのドキュメントを参照してください。

URL プロパティ

受信した HTTP 要求の URL (問い合せ文字列を除いた部分) を探すには、%CSP.RequestOpens in a new tab オブジェクトの URL プロパティを使用します。

 Write "URL: ", %request.URL

Data プロパティおよび URL パラメータ

URL にはパラメータのリスト (URL クエリ) を指定できます。%CSP.RequestOpens in a new tab オブジェクトは、これらを Data プロパティを通して利用できるようにします。

例えば、受信した URL が以下を含むとします。

/csp/user/MyPage.csp?A=10&a=20&B=30&B=40

以下を使用して、サーバ上のこれらのパラメータを検索できます。

 Write %request.Data("A",1)    // this is 10
 Write %request.Data("a",1)    // this is 20
 Write %request.Data("B",1)    // this is 30
 Write %request.Data("B",2)    // this is 40

Data は多次元のプロパティで、その中に格納されたそれぞれの値には、パラメータ名と、パラメータのインデックス番号という 2 つの添え字があります (パラメータは、上記の例の B のように、URL 内で複数回使用できます)。このパラメータ名は大文字と小文字を区別しますので、注意してください。

また、受信した HTTP 要求が GET 要求か POST 要求であるかは重要ではありません。Data プロパティでは、まったく同じ方法でパラメータ値が表されます。

指定されたパラメータ値が定義されているかどうかを確認するには、ObjectScript の $Data ($D) 関数を使用します。

 If ($Data(%request.Data("parm",1))) {
 }

参照するパラメータが定義されているかどうか不明な場合は、ObjectScript の $Get 関数を使用します。

 Write $Get(%request.Data("parm",1))

特定のパラメータ名に定義された値の数を知るには、%CSP.RequestOpens in a new tabCount メソッドを使用します。

 For i = 1:1:%request.Count("parm") {
    Write %request.Data("parm",i)
 }

CgiEnvs プロパティおよび CGI 環境変数

Web サーバは、CGI (Common Gateway Interface) 環境変数という、HTTP クライアントや Web サーバの情報を含む一連の値を提供します。これらの CGI 環境変数に設定されている値へは、多次元プロパティである CgiEnvs を使用してアクセスできます。Data プロパティと同じ方法を使用できます。

例えば、HTTP 要求を作成したブラウザのタイプを判断するには、CGI 環境変数 HTTP_USER_AGENT の値を調べます。

 Write %request.CgiEnvs("HTTP_USER_AGENT")

使用できる CGI 環境変数については、"CSP ゲートウェイ構成ガイド" の “CGI 環境変数” のセクションを参照してください。

Cookies プロパティ

HTTP 要求に cookie が含まれる場合は、その値を多次元プロパティ、Cookies で検索できます。Data プロパティと同じ方法を使用できます。

クッキーの設定例については、このドキュメントの “%CSP.Response オブジェクトおよび OnPreHTTP メソッド” を参照してください。

データは %session オブジェクトに保存することもできます。“ユーザ・セッション・データ – Data プロパティ” を参照してください。 クッキーの使用例については、CSP サンプル・データベースの cookie.csp を参照してください。

MIME データ・プロパティ

受信した要求には、MIME (Multipurpose Internet Mail Extensions) データが含まれることがあります。 これは一般的に、ファイルなどの大規模な情報に対して使用されます。 MIME データは、%CSP.RequestOpens in a new tab オブジェクトを使用して取得することができます。 これは、MIME データの読み取りに使用できる Caché ストリーム・オブジェクトのインスタンスを作成し、返します。

MIME データの利用例は、CSP サンプルの “upload.cspOpens in a new tab” ページを参照してください。

%CSP.Response オブジェクトおよび OnPreHTTP メソッド

HTTP クライアントへ返される応答ヘッダの管理には、%CSP.ResponseOpens in a new tab オブジェクトを使用します。CSP サーバは、自動的にこのクラスのインスタンスを作成し、このインスタンスへの参照を変数 %response に配置します。

%response オブジェクトは HTTP ヘッダを管理しているので、通常、そのプロパティは %CSP.PageOpens in a new tab クラスの OnPreHTTP メソッドで設定します。例えば、受信したHTTP 要求を転送するには、以下の OnPreHTTP メソッドを定義します。

Class MyApp.Page Extends %CSP.Page
{
// ...

ClassMethod OnPreHTTP() As %Boolean
{
    Set %response.ServerSideRedirect = "C:\CacheSys\csp\samples\redirect.csp"
    Quit 1
}
}

CSP クラスを使用して CSP ページを作成する場合は、次のコードを使用してヘッダ値を設定します。

Class MyPage Extends %CSP.Page
{
ClassMethod OnPreHTTP() As %Boolean
{
    Do %response.SetCookie("name","value")
    Quit 1
}

HTML を使用して CSP ページを作成する場合は、次のコードを使用してヘッダ値を設定します。

<head></head>
<script language="Cache" method="OnPreHTTP" arguments="" returntype="%Boolean"> 
    Do %response.SetCookie("name","value") 
    Quit 1
</script>
<body></body>

SetCookie メソッドによる Cookie の送信

HTTP クライアントに cookie を送信する場合は、%response オブジェクトの SetCookie メソッドを使用します。“Cookie へのデータの格納” のセクションを参照してください。

クッキーへのアクセス

クッキーが保存されている場合、以下のコードを使用してその値にアクセスできます。

[Page クラスのコード]

ClassMethod OnPage() As %Status 
{ 
Write "<body>"
Write "<p>COOKIES:</p>" 
Write "<ul>"
Set cookie=%request.NextCookie("")
While cookie'="" { 
      For count=1:1:%request.CountCookie(cookie) { 
   Write "<li>",cookie," - ",..EscapeHTML(%request.GetCookie(cookie,count)),"</li>",! 
   }
Set cookie=%request.NextCookie(cookie)
} 
Write "</ul>"
Write !,"</body>"
Quit $$$OK 
} 

[CSP ページのコード]

<body>
<p>COOKIES:</p>
<ul>
<script language="Cache" runat="server">
Set cookie=%request.NextCookie("")
While cookie'="" {
    For count=1:1:%request.CountCookie(cookie) {
    Write "<li>",cookie," - ",..EscapeHTML(%request.GetCookie(cookie,count)),"</li>",!
    }
Set cookie=%request.NextCookie(cookie)
}
</script>
</ul>
</body>

クッキーの定義には、次の形式で有効期限とパスを含めることができます。

Do %response.SetCookie("NAME","VALUE",expireData,path)

expireData フィールドが空白の場合、メモリ内のクッキーが定義されます。これに対して、expireData フィールドに値を指定した場合には、このクッキーは指定した期間で削除される永続的なクッキーになります。expireData フィールドの形式は、Wdy, DD-Mon-YYYY HH:MM:SS GMT です (例 : Wednesday, 24-Mar-2004 18:12:00 GMT)。

さまざまなコンテンツ・タイプの提供

通常、CSP ページは text/html コンテンツを提供します。さまざまなコンテンツを指定するには、次のような方法があります。

  • ページ・クラスで、%CSP.PageOpens in a new tab クラス・パラメータ CONTENTTYPE を設定する方法

  • ページの OnPreHTTP メソッド内で、 %response オブジェクトの ContentType プロパティの値を設定する方法

FeedbackOpens in a new tab