2023年5月19日金曜日

リージョン・タイプURLを使ってみる

 Oracle APEXで使用できるリージョンのタイプにURLというものがあります。これは外部のURLを参照して、リージョンの内容として表示するというものです。組入れモードとして、IFrame、Inline(no escaping)、Inline(escape special characters)の3種類を選べます。

参照される側として、以下のアプリケーションを作成します。

サンプル・データセットのEMP/DEPTに含まれる表EMPをソースとしたクラシック・レポートを画面左に配置し、表DEPTのクラシック・レポートを画面右に配置します。

参照される側のアプリケーションは、APEXアプリケーションではないことが一般的です。クリックジャッキングといった脆弱性の元になるため、APEXアプリケーションはデフォルトでiFrameへの埋め込みを禁止しています。

アプリケーション名はSource Appとしています。アプリケーションのエクスポートは以下になります。
https://github.com/ujnak/apexapps/blob/master/exports/source-app.zip


このアプリケーション全体をiFrameに取り込むアプリケーションを作成します。

アプリケーション名はiFrame Appとしています。アプリケーションのエクスポートは以下になります。
https://github.com/ujnak/apexapps/blob/master/exports/iframe-app.zip



EMPのレポートとDEPTのレポートをそれぞれリージョンにInlineで読み込み、配置を変えて表示するアプリケーションを作成します。

アプリケーション名はInline Appとしています。アプリケーションのエクスポートは以下になります。
https://github.com/ujnak/apexapps/blob/master/exports/inline-app.zip


3つのアプリケーションともに、ホーム・ページのみに機能を実装しています。

参照される側のSource Appには、表EMPをソースとしたクラシック・レポートを作成しています。

Inlineでの組込みの範囲を指定するため、ヘッダーおよびフッターのヘッダー・テキストとして<!-- start:report-emp -->、フッター・テキストとして<!-- end:report-emp -->を設定しています。コメントであるため、画面には表示されません。


同様に表DEPTをソースとしたクラシック・レポートでは、ヘッダー・テキストとして<!-- start:report-dept -->、フッター・テキストとして<!-- end:report-dept -->を設定しています。


アプリケーション定義のセキュリティのブラウザ・セキュリティのセクションに含まれるフレームへの埋込みを、デフォルトの拒否から同じ起点から許可に変更します。これはX-Frame-Optionsヘッダーに指定する値です。

組込む方法が異なるため、この設定はInlineでの組込みに影響を与えません。


iFrame AppとSource Appが同じワークスペースに作成されている場合、認証スキームのセッション共有で同じCookie名に設定にしていると、iFrame AppとSource Appでセッションを共有できます。つまり、iFrame AppがSource Appを呼び出す際に、Source Appのログイン処理をスキップできます。


Source Appを埋め込むiFrame Appには、識別のタイプがURLであるリージョンだけが作成されています。


URLリージョンの高さは自動調整されないためテンプレート・オプションを使って、Body Heightとして640pxを設定しています。


プロパティ・エディタでリージョンの属性を開きます。

設定のURLにSource Appのホーム・ページを指すURLを入力します。session=&APP_SESSION.としてセッションIDを渡すことによりセッションが引き継がれ、ログイン処理がスキップされます。

https://ホスト名/ords/r/apexdev/source-app/home?session=&APP_SESSION.

組入れモードはIFrame、IFrame属性としてwidth=100% height=100%を設定しています。


IFrame(インラインフレーム要素)そのものが実装されていると考えてよいでしょう。

Inline Appでは、URLリージョンの組入れモードをInline (no escaping)にしています。

表DEPTを表示するリージョンでは、設定のHTML破棄の終了として<!-- start:report-dept -->(この文字列が現れるまでは、HTMLテキストを破棄する - つまりここからが表示を開始する)、HTML破棄の開始として<!-- end:report-dept -->(ここからのHTMLテキストは破棄する - つまりここで表示を終了する)を設定しています。


表EMPを表示するリージョンのHTML破棄の終了は<!-- start:report-emp -->、HTML破棄の開始は<!-- end:report-emp -->です。


組入れモードがIFrameの場合は、設定されたURLはブラウザがアクセスします。Inlineの場合は、バックエンドのデータベースがアクセスします。これは動的コンテンツのリージョンで、以下のコードを実行しているのと同様です。


データベース・サーバーによってHTTPリクエストが発行されているため、ソースとなっているAPEXアプリケーションは認証なし(またはパブリック・ページ)になっている必要があります。

リージョン・タイプURLの紹介は以上になります。

Oracle APEXのアプリケーション作成の参考になれば幸いです。

完