目次へ

3.3. HTTPヘッダーの取り扱い

HTTPプロトコルの内容を直接取り扱いたい場合が考えられます。リクエストの際に取り扱うには「javax.servlet.http.HttpServletRequest」、レスポンスの際には「javax.servlet.http.HttpServletResponse」を使用します。まずHttpServletRequestについて説明します。

public class SampleServlet extends HttpServlet{
  protected void doGet(HttpServletRequest request,HttpServletResponse response)
    throws ServletException,IOException{
    String userAgent=request.getHeader("User-Agent");
    ....

基本的に「getHeader」メソッドを使用して値を取り出します。指定したヘッダーが無い場合にはこのメソッドはnullを返します。指定した名前に対して複数のヘッダー値がある場合には、「getHeaders」メソッドを使用します。値をint型で取り出したい場合には「getIntHeader」、ヘッダー名の一覧を取得したい場合には「getHeaderNames」メソッドを使用します。

他にもHTTPのメソッドを取得する「getMethod」、ログインした場合にユーザ名を取得する「getRemoteUser」、リクエストの日時を取得する「getDateHeader」などがあります。ユーザのリクエストURLをクエリーパラメータ抜きで再構築する、「getRequestURL」メソッドは便利なので覚えておくと良いでしょう。

リクエスト場合の説明をします。

public class SampleServlet extends HttpServlet{
  protected void doGet(HttpServletRequest request,HttpServletResponse response)
    throws ServletException,IOException{
    response.sendError(HttpServletResponse.SC_NOT_FOUND);
  }
}

サンプルのサーブレットを実行すると、ブラウザには404エラーが表示されます。「sendError」はHTTPエラーを返すメソッドで、引数にHttpServletResponseクラスで定義されている定数を指定します。ここでは404エラーを表す、「HttpServletResponse.SC_NOT_FOUND」を指定しています。このメソッドの使用には注意点が1つあり、エラーコードを返すまでに何らかの出力を一切行ってはいけません。もし行っていた場合には「java.lang.IllegalStateException」が発生します。

エラーではないステータスコードを返す場合には、「setStatus」メソッドを使用します。sendErrorと違い、ただちにステータスコードが送信されるわけではありません。

HTTPヘッダーを取り扱う場合には、「setHeader」「addHeader」等を使用します。リダイレクトを行う場合には、「sendRedirect」メソッドを使用するのが便利です。

(実習課題3)

以下のサーブレットプログラムを作成しなさい。

  • UserAgentヘッダーから、ブラウザの種別(IEかNetscapeかそれ以外)を判定する。
  • IEであった場合には、「Forbidden」エラーを返すようにする事。
  • Netscapeであった場合には、何らかの表示を返すこと。
  • それ以外であった場合には、特定のページにリダイレクトさせるようにする事。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp