FORM送信

概要

x-Servlet Version2.0以降ではhidden情報の管理や、入力項目のname属性書き換えなどを行っているため、端末に出力されたMLを見ると元コンテンツとの対応が取れていないように見える場合があります。FORM送信に関する処理について記述します。

機能説明

1. コンテンツ取得

端末からのリクエストに適合する元コンテンツを取得します。

2. フォームに関する前処理

端末からのリクエストに適合する元コンテンツを取得します。

  1. name属性の書き換え
    form内に存在する端末に出力が必要な入力項目のname属性を連番に書き換えます。新たなname属性と元のname属性との対応はメモリ内に格納しておきます。
  2. option value属性の書き換え
    option内の value属性を連番に置き換えます。
    新たなvalue属性と元のvalue属性との対応はメモリ内に格納しておきます。
  3. action属性の書き換え
    action属性をこのページを取得したときのリクエストURIに書き換えます。(これによりリクエストがx-Servletに送られるようになります)
    書き換えたaction属性と元のaction属性との対応はメモリ内に格納しておきます。
  4. methodの書き換え
    元コンテンツにmethod="post"が記述されている状態でPOST非対応端末からアクセスがあった場合には、method="get"に書き換えて端末に返します。
    method="get"に書き換えられた端末からのSUBMITを受信した場合にはmethod="post"に復元してリクエストをサーバに送信します。
    書き換えたmethod属性と元のmethod属性との対応はメモリ内に格納しておきます。
  5. type="hidden"の文字の置換えと退避
    type="hidden" が存在し、through属性が指定されていない場合は以下の処理が行われます。
    • xproxy.properties の hiddenValueDecode が有効な場合、文字の置き換えを行います。
    • name属性と value属性の値をメモリ内に格納した後コンテンツから削除します。
  6. 識別用IDの埋め込み
    <input type="hidden" name="_xpxi">タグにメモリ内に格納した情報を識別するためのIDを埋め込みます。

3. ML変換

アクセスしてきた機種にあわせてML変換をおこないレスポンスを出力します。

4. 端末上でSUBMIT押下

端末から入力されたデータとメモリ内に格納した情報を識別するためのIDが送信されてくるので端末で入力された値をメモリ内に格納した情報に反映します。FORMでページ分割が発生した場合は分割が発生した分だけこの処理が繰り返されます。

5. データ入力完了

端末からのリクエストに適合する元コンテンツを取得します。

元のmethodが GET の場合 (Version2.9.0以上、または Version2.9.0未満で "getFormRedirect=false" の場合)

FORMの入力が完了した時点でメモリ内に格納した情報を用いてサーバへのリクエストを構成しサーバにリクエストを出力します。


元のmethodが GET の場合(Version2.9.0未満で "getFormRedirect=true" の場合)

FORMの入力が完了した時点でメモリ内に格納した情報を用いてサーバへのリクエストを構成します。
このリクエストはリダイレクトに用いられますが、リダイレクトのURIは絶対URIでなくてはならないのでaction属性は適切に変換されます。
構成されたURIに対してリダイレクトを行うように端末にリダイレクトレスポンスを出力します。
端末がこのリダイレクトを処理することでFORM送信が完了します。
※リダイレクト処理を行わず、そのままサーバにリクエストを出力することも可能です。


元のmethodが POST の場合

FORMの入力が完了した時点でメモリ内に格納した情報を用いてサーバへのリクエストを構成しサーバにリクエストを出力します。

注意点

  • リクエスト発生源について(Version2.9.0未満で "getFormRedirect=true" の場合)
    GETメソッドとPOSTメソッドで最終的なリクエスト発生源が異なります。
    一般的なコンテンツではこれが問題になることは有りませんが、action属性がcontentsRule.xmlで記述した元コンテンツサーバ以外を指しているようなコンテンツでメソッドがGETの場合はリクエスト発生源が端末となるため動作する可能性があります。
    ただし、メソッドがPOSTの場合にはx-Servletがリクエスト発生源になるため、変換対象コンテンツサーバ以外へのアクセスとなりエラーを返すこととなります。
  • hidden属性で置き換えられる文字は「&lt;」「&gt;」「&#39;」「&quot;」「&amp;」のみです。
    別の参照文字である「&#60;」「&#62;」「&apos;」「&#34;」「&#38;」は置き換えられません。
  • type="hidden" にthrough属性が指定されている場合は文字の置き換え、メモリ内への格納は行われず input 文がそのままレスポンスされます。
  • x-Servletからwebサーバへのリクエストメソッドは元コンテンツに記載されたメソッドになります。
    例えば元コンテンツのメソッドがPOSTで記載されている時、端末から意図的にメソッドをGETにしてリクエストしてもメモリ領域に格納されている元のメソッド(POST)で送信されます。
TOP