[Java] 53. ウェブサービス(Web service)でエラーページを処理する方法


Study / Java    作成日付 : 2021/06/25 13:35:54   修正日付 : 2021/06/25 13:35:54

こんにちは。明月です。


この投稿はウェブサービス(Web service)でエラーページを処理する方法に関する説明です。


基本的なウェブプロジェクトを設定することは以前の投稿まで説明することで終わりました。

ウェブサービスのフレームワークのSpring framworkを設定することからデータベースのORM(Object reference mapping)のJPA設定間です。つまり、実際にクライアント(ブラウザ)がサーバに接続して当該なデータをデータベースから取得してクライアント(ブラウザ)に表示するHTMLをパーシングする作業までです。

ここまで設定してプロジェクトを作成してウェブプログラムを運用することで問題はありません。


しかし少しディテールな作業があります。例えば、エラーが発生した時、エラーページを表示する作業やログイン管理のため、セッション作業などのプログラムの完成度を上げるような作業です。


基本的にトムキャットサービスでエラーが発生すると下記とおりのページが表示されます。


実際に運用するウェブサービスで上みたいなページが表示されるとダメです。何かが完成されてないみたいな画面です。


それでエラーが発生した時、我々が指定したページを表示するような方法があります。

ウェブ設定(web.xml)でエラーフォーワードを設定することができます。

<error-page>
  <location>/error.html</location>
</error-page>


上の設定はerrorが発生した場合にerror.htmlに遷移することです。


私は拡張子が.htmlの場合、Spring frameworkのControllerをとおりようにしましたのでControllerクラスにerror.htmlを設定します。

package controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class Home {
  // 要請urlパターン(index.html)
  @RequestMapping(value = "/index.html")
  public String index(ModelMap modelmap, HttpSession session, HttpServletRequest req, HttpServletResponse res) {
    modelmap.addAttribute("Data", "Hello world");
    // viewのファイル名
    return "index";
  }

  // 要請urlパターン(error.html)
  @RequestMapping(value = "/error.html")
  public String error(ModelMap modelmap, HttpSession session, HttpServletRequest req, HttpServletResponse res) {
    // modelmapにerror codeを設定
    modelmap.addAttribute("Data", "error code : " + res.getStatus());
    // viewのファイル名
    return "error";
  }
}
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Error</title>
  </head>
  <body>
    <!-- modelmapから貰うデータ -->
    ${Data}
  </body>
</html>

error.htmlに要請するパターンを設定してerror.jspとパーシングしてブラウザに応答します。


確実にerror.htmlが要請されエラーコードが404(ページ無し)が表示されます。

ブラウザデバッグモードでnetworkタブの要請応答の状況を確認すればerror要請すれば404エラーが発生しますが、redirectで発生したこと(再送信)ではなく、errorページに関数エラーページが発生しました。


実際のサービスでエラーが発生するか間違いアドレスに接続すると、基本トムキャットページではなく、エラーページが表示することを見たことがあります。


上のイメージはグーグルで間違いアドレスに接続した場合に表示される画面です。


ウェブのエラーコード別に各別のページを設定することもできます。

<error-page>
  <error-code>404</error-code>
  <location>/error-404.html</location>
</error-page>
<error-page>
  <error-code>500</error-code>
  <location>/error-500.html</location>
</error-page>


package controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class Home {
  // 要請urlパターン(index.html)
  @RequestMapping(value = "/index.html")
  public String index(ModelMap modelmap, HttpSession session, HttpServletRequest req, HttpServletResponse res) {
    // 強制エラー発生(500エラーコード)
    throw new RuntimeException();
  }

  // 要請urlパターン(error.html)
  @RequestMapping(value = "/error-404.html")
  public String error(ModelMap modelmap, HttpSession session, HttpServletRequest req, HttpServletResponse res) {
    // modelmapにerror code設定
    modelmap.addAttribute("Data", "error code : 404 ");
    // viewのファイル名
    return "error";
  }

  // 要請urlパターン(error-500.html)
  @RequestMapping(value = "/error-500.html")
  public String error500(ModelMap modelmap, HttpSession session, HttpServletRequest req, HttpServletResponse res) {
    // modelmapにデータ設定
    modelmap.addAttribute("Data", "This is 500 error");
    // viewのファイル名
    return "error";
  }
}


上の例はindex.htmlページを要請したらExceptionが発生して500エラーコードが発生します。

そうならerror500関数を呼び出してerror.jspページの"This is 500 error"の値を表示します。


エラーコードではなく、もっと細かくExceptionの種類の別で処理ページを分けることができます。

<error-page>
  <error-code>404</error-code>
  <location>/error-404.html</location>
</error-page>
<error-page>
  <exception-type>java.lang.NullPointerException</exception-type>
  <location>/error-NullPointException.html</location>
</error-page>


package controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class Home {
  // 要請urlパターン(index.html)
  @RequestMapping(value = "/index.html")
  public String index(ModelMap modelmap, HttpSession session, HttpServletRequest req, HttpServletResponse res) {
    // 強制エラー発生
    throw new NullPointerException();
  }

  // 要請urlパターン(error.html)
  @RequestMapping(value = "/error-404.html")
  public String error(ModelMap modelmap, HttpSession session, HttpServletRequest req, HttpServletResponse res) {
    // modelmapにerror code設定
    modelmap.addAttribute("Data", "error code : 404 ");
    // viewのファイル名
    return "error";
  }

  // 要請urlパターン(error-NullPointException.html)
  @RequestMapping(value = "/error-NullPointException.html")
  public String errorNullPointException(ModelMap modelmap, HttpSession session, HttpServletRequest req, HttpServletResponse res) {
    // modelmapにデータ設定
    modelmap.addAttribute("Data", "Null point exception");
    // viewのファイル名
    return "error";
  }
}

今回はindex.htmlでNullPointerExceptionエラーを発生しました。


最近の小さいサイトをみればエラー処理を設定しなくて、ウェブサーバ(WAS)で設定されている基本エラーページが見える場合があります。

単純なエラーページなら別に問題ないですが、どのケースにはソース内部のデバッグやcall stack情報がみえる時もあります。ソース内部の情報が見えたらセキュリティ(Security)としてすごく悪いので、このエラー処理はする方が良いです。


ここまでウェブサービス(Web service)でエラーページを処理する方法に関する説明でした。


ご不明なところや間違いところがあればコメントしてください。

Java
最新投稿