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
https://github.com/ujnak/apexapps/blob/master/exports/iframe-app.zip
3つのアプリケーションともに、ホーム・ページのみに機能を実装しています。
同様に表DEPTをソースとしたクラシック・レポートでは、ヘッダー・テキストとして<!-- start:report-dept -->、フッター・テキストとして<!-- end:report-dept -->を設定しています。
EMPのレポートとDEPTのレポートをそれぞれリージョンにInlineで読み込み、配置を変えて表示するアプリケーションを作成します。
アプリケーション名はInline Appとしています。アプリケーションのエクスポートは以下になります。
https://github.com/ujnak/apexapps/blob/master/exports/inline-app.zip
参照される側のSource Appには、表EMPをソースとしたクラシック・レポートを作成しています。
Inlineでの組込みの範囲を指定するため、ヘッダーおよびフッターのヘッダー・テキストとして<!-- start:report-emp -->、フッター・テキストとして<!-- end:report-emp -->を設定しています。コメントであるため、画面には表示されません。
アプリケーション定義のセキュリティのブラウザ・セキュリティのセクションに含まれるフレームへの埋込みを、デフォルトの拒否から同じ起点から許可に変更します。これはX-Frame-Optionsヘッダーに指定する値です。
組込む方法が異なるため、この設定はInlineでの組込みに影響を与えません。
iFrame AppとSource Appが同じワークスペースに作成されている場合、認証スキームのセッション共有で同じCookie名に設定にしていると、iFrame AppとSource Appでセッションを共有できます。つまり、iFrame AppがSource Appを呼び出す際に、Source Appのログイン処理をスキップできます。
設定の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の場合は、バックエンドのデータベースがアクセスします。これは動的コンテンツのリージョンで、以下のコードを実行しているのと同様です。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
declare | |
l_response clob; | |
l_begin pls_integer; | |
l_end pls_integer; | |
C_START constant varchar2(40) := '<!-- start:report-dept -->'; | |
C_END constant varchar2(40) := '<!-- end:report-dept -->'; | |
begin | |
l_response := apex_web_service.make_rest_request( | |
p_url => :G_APEX_PATH || 'r/apexdev/source-app/home' | |
,p_http_method => 'GET' | |
); | |
l_begin := instr(l_response, C_START) + length(C_START); | |
l_response := substr(l_response,l_begin); | |
l_end := instr(l_response, C_END) - 1; | |
l_response := substr(l_response, 1, l_end); | |
-- return apex_escape.html(l_response); -- エスケープあり | |
return l_response; -- エスケープなし | |
end; |
データベース・サーバーによってHTTPリクエストが発行されているため、ソースとなっているAPEXアプリケーションは認証なし(またはパブリック・ページ)になっている必要があります。
リージョン・タイプURLの紹介は以上になります。
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完