Java Servletのウェルカムページとエラーページ

ウェルカムページ

ディレクトリだけを指定してアクセスしてきた場合に表示するページ。

web.xml に下記のように記述する。

<web-app>
  ...
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>test.jsp</welcome-file>
  </welcome-file-list>
  ...
  </web-app>

welcome-file 要素は複数記述できる。もし複数ファイルが存在した場合には、welcome-file-list 要素内で一番上に定義されているものが表示する。

エラーページ

エラーページは、HTTPエラーや例外が発生した時に表示するページのこと。エラーページの設定もweb.xmlで行う。HTTPエラーや例外の種類に応じて、表示させるページを変えることができる。

web.xmlerror-page 要素を記述する。error-page要素は welcome-file-list 要素の後、tag lib 要素の前に記述すること。

<web-app>
  ...
  </welcome-file-list>
  <error-page>
    <error-code>403</error-code>
    <location>/WEB-INF/403.html</location>
  </error-page>
  <error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/WEB-INF/error.jsp</location>
  </error-page>
  <taglib>
  ...
</web-app>
ステータスコードの分類

頻繁に表示される可能性のある、以下のエラーコードについてはエラーページを用意しておく。

  • 401 Unauthorized: 認証が必要である。Basic認証やDigest認証などを行うときに使用される。たいていのブラウザはこのステータスを受け取ると、認証ダイアログを表示する。
  • 403 Forbidden: 禁止されている。リソースにアクセスすることを拒否された。リクエストはしたが処理できないという意味。アクセス権がない場合や、ホストがアクセス禁止処分を受けた場合などに返される。例: 社内(イントラネット)からのみアクセスできるページに社外からアクセスしようとした。
  • 404 Not Found: 指定したページが見つからない。単に、アクセス権がない場合などにも使用される。
  • 500 Internal Server Error: サーバ内部エラー。サーバ内部にエラーが発生した場合に返される。例として、CGIとして動作させているプログラムに文法エラーがあったり、設定に誤りがあった場合などに返される。
500 Internal Server Error 時のレスポンスについて

サーバ内部エラー発生時に 500 Internal Server Error を返却するのはセキュリティ上好ましくない(※)ため、403 Forbidden を返却するようにする。

※「任意のパラメータを送るとサーバ内部エラーが発生する」ことが外部からわかると攻撃対象になりうる

/WEB-INF/error.jsp

<%@ page trimDirectiveWhitespaces="true"%>
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<%
// 返却するステータスに 403 Forbidden を設定
response.setStatus(HttpServletResponse.SC_FORBIDDEN);

// セッションを破棄
session.invalidate();

// エラーページ /WEB-INF/403.html にフォワードする
request.getRequestDispatcher("/WEB-INF/403.html").forward(request, response);
%>