ページの先頭行へ戻る
Enterprise Application Platform V1.2.0 GlassFishユーザーズガイド

1.5.3 Webアプリケーションの注意事項

以下について説明します。

セッション使用時の注意

セッションIDについて

セッションIDの一意性の範囲、桁数、使用文字、フォーマットは、本製品のバージョンアップや修正適用に伴い変更される可能性があります。
そのため、これらに依存したアプリケーションや、Webアプリケーション範囲以外へのセッションIDの利用はおすすめいたしません。
例えば、セッションIDをデータベースに登録した場合は、本製品のバージョンアップによってカラムの桁数不足が発生する可能性があります。
また、リクエストやユーザーの正当性や一意性につきましては、セッションIDのみに依存しない方法により適切にチェック/保証するようにしてください。

セッションCookieについて

Cookieによるセッション管理は、Webコンテナによって自動的に行われます。
セッションCookieの追加などの操作は、アプリケーションで行わないようにしてください。
セッション継続やセキュリティ上の問題が発生する場合があります。

SSLアクセラレータを使用する場合

WebサーバがSSL環境で動作している場合には、セッションCookieに自動的にSecure属性を付加します。
SSLアクセラレータを使用しておりWebサーバが非SSL(HTTP)で動作している場合には、Secure属性は自動的に付加しません。Secure属性を付加する方法については、Eclipse GlassFishドキュメントのdeployment descriptorの説明を参照してください。

セッションIDを含むURLを生成する場合

WebアプリケーションでセッションIDを含むURLを生成する場合、以下のいずれかのAPIを使用するようにしてください。これらのAPIを使用しない場合、WebサーバがセッションのあるGlassFish Serverインスタンスに対して正しくリクエストを振り分けない可能性があります。

  • jakarta.servlet.http.HttpServletResponse#encodeURL(String)

  • jakarta.servlet.http.HttpServletResponse#encodeRedirectURL(String)

文字コードについて

Webブラウザからのリクエストを読み込む時の文字コードについて

Webブラウザからのリクエストを正しい文字コードで処理するための方法には、以下の2つがあります。

Servlet APIでの指定

以下のServlet APIを使用して、文字コードを指定します。

  • jakarta.servlet.ServletRequest.setCharacterEncoding

詳細は、Servletの仕様を参照してください。

  request.setCharacterEncoding("SJIS");

注意

このメソッドは、リクエストのパラメータを読み込む前、またはgetReaderメソッドを呼び出す前に実行されなければなりません。

glassfish-web.xmlでの指定

glassfish-web.xmlの<parameter-encoding>タグで文字コードを指定します。
定義方法の詳細は、Eclipse GlassFishドキュメントを参照してください。

  <parameter-encoding default-charset="SJIS"/>

注意

jakarta.servlet.ServletRequest.setCharacterEncodingが指定されている場合は、setCharacterEncodingで指定された値が優先されます。

レスポンヘッダに指定する文字コード

HTTPレスポンスヘッダには、印字可能なASCIIコード範囲の文字を指定するようにしてください。それ以外の文字は、半角空白に置き換えられてクライアントに返却されます。

日本語などのASCIIではないファイル名のファイルをダウンロードする場合

WebアプリケーションでHTTPレスポンスヘッダにContent-Dispositionヘッダを設定することによりファイルのダウンロードが行われる場合、Content-Dispositionヘッダのfilename属性に日本語やISO-8859-1などの印字可能なASCIIコード範囲でない文字を指定すると、ダウンロードしたファイルのファイル名が文字化けすることがあります。

そのため、RFC6266に則りfilename*属性にURLエンコードしたファイル名を指定するようにしてください。このとき、java.net.URLEncoderのencodeメソッドを使用すると半角空白は+に変換されるため、encodeメソッドを実行して得られた文字列の「+」を「%20」に置換するようにしてください。

ファイル名「日本語ファイル名 (1).txt」をダウンロードするサーブレットのコード例

String fileName="日本語ファイル名 (1).txt";
String encodedFileName = URLEncoder.encode(fileName, "UTF-8");
encodedFileName = encodedFileName.replace("+", "%20");
response.setContentType("text/plain");
response.setHeader("Content-Disposition", "attachment; filename*=UTF-8\'\'" + encodedFileName);

JSPの入れ替えについて

JSPのコンパイル結果をコピーする場合

JSPのオートリロード機能を使用している場合、JSPのコンパイルは、JSPまたはJSPから静的includeされているファイルのタイムスタンプが、前回JSPのコンパイルをした時刻よりも未来の場合に実行されます。
したがって、開発中のJSPまたはJSPから静的includeされているファイルを修正前の状態に戻す場合は、ファイルのタイムスタンプをマシンの現在の時刻に更新してください。

JSPファイルを置き換える場合

JSPのオートリロード機能を使用して、GlassFish Serverクラスターが起動中に配備済みアプリケーションのJSPファイルを置き換える場合は、cpコマンドは使用せず、mvコマンドを使用して置き換えてください。

その際、移動元と移動先が同じファイルシステム上になるよう考慮が必要です。

移動先と別ファイルシステムから移動する場合には、移動先と同一ファイルシステム上の作業ディレクトリーに一度コピーした後に置き換えるようにしてください。

cpコマンドを使用した場合、その処理はアトミック(※)に行われないため、不完全な状態のJSPファイルで動作する可能性があり、JSPの処理でエラーが発生する。または、意図どおりの画面が表示されない場合があります。

※アトミックとは、更新途中など不完全な状態のファイルに対し参照されないことを保証している、という意味になります。

また、以下の場合も移動元ファイルを移動先ファイルにコピーする処理となるため、cpコマンドで置き換えた場合と同様になります。

  • 移動元と移動先が異なるファイルシステム間でmvコマンドで置き換えた場合。

ServletContext/ServletRequestの属性について

以下のプレフィックスで始まる属性は、予約されています。
値は、変更しないでください。

また、ServletContextAttributeListener/ServletRequestAttributeListenerが設定されている場合、Webコンテナが上記プレフィックスで始まる属性を追加、更新、削除するタイミングでリスナーのメソッドが呼び出されます。

FORM認証について

POSTメソッドに対して認証を実施する場合の注意事項

以下の条件を満たした場合、Webブラウザに「HTTP Status 405」が表示され、リクエストの処理に失敗します。そのため、<http-method>には、GETも指定してください。

  1. WebアプリケーションでJakarta EEセキュリティ機能を使用、かつ

  2. FORM認証である場合、かつ

  3. deployment descriptor(web.xml)で<http-method>にPOSTのみ指定している場合、かつ

  4. 1.のWebアプリケーションに対して、3.の設定が有効となるコンテンツに対してHTTP POSTリクエストを送信、かつ

  5. FORM認証の画面から目的のコンテンツに遷移した場合

認証後にリクエストのボディを取得する場合の注意事項

以下の条件を満たした場合、ボディーを含むHTTP POSTリクエストを送信しても、Webアプリケーション内ではリクエストのボディーを正しく取得できません。HTTP POSTリクエストを送信するときには、FORM認証の画面が表示されない状態(認証が 完了した状態)になるようにアプリケーションを作成してください。

  1. WebアプリケーションでJakarta EEセキュリティ機能を使用、かつ

  2. FORM認証である場合、かつ

  3. ServletまたはJSPでリクエストのボディーを取得、かつ

  4. Webアプリケーションに対して、HTTP POSTリクエストを送信、かつ

  5. FORM認証の画面から目的のコンテンツに遷移した場合

HTTP/2使用時の注意

X-Powered-Byヘッダーフィールドについて

HTTP/2接続時には、ネットワーク設定の定義項目「X-Powered-By ヘッダーフィールド」の値に関わらず、Webコンテナが生成するHTTPレスポンスにX-Powered-Byヘッダーフィールドは含まれません。

本定義項目の詳細については、「10.9.3 ネットワーク設定の定義項目」の「X-Powered-By ヘッダーフィールド」を参照してください。

HTTPレスポンスのデータ形式とヘッダについて

HTTP/2接続時には、サーブレットやJSPに対するHTTPレスポンスに“content-length”ヘッダがデフォルトで含まれません。また、“transfer-encoding: chunked”ヘッダが含まれることはありません。

HTTPクライアントを設計する場合は、HTTPレスポンスにこれらのヘッダが含まれない場合があることを想定した設計にしてください。

ただし、以下のいずれかの条件を満たす場合には、HTTPレスポンスに“content-length”ヘッダは含まれます。

  • jakarta.servlet.ServletResponseインターフェイスのsetContentLengthメソッドまたはsetContentLengthLongメソッドにより、明示的に本文の長さを指定している。または、

  • 静的リソース(HTMLページや画像など)に対するリクエストへのレスポンスである。または、

  • サーブレットに対するHTTP HEADメソッドのリクエストへのレスポンスである場合。