- 3.1. Webアプリケーション全体の初期設定値の読み出し
- 3.2. ログの書き込み
- 3.3. HTTPヘッダーの取り扱い
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であった場合には、何らかの表示を返すこと。
- それ以外であった場合には、特定のページにリダイレクトさせるようにする事。