outオブジェクトがコンテンツ本体の出力を制御する役割を担っていたのに対し、responseオブジェクトはむしろコンテンツ本体に付随するヘッダ情報やステータスを制御する際に用います。
一見、outもresponseも「クライアントへの出力手段を制御するための手段」を提供するオブジェクトですので区別がつきにくいかもしれませんが、ざっくりと区分するならば、前者は可視的な情報を、後者は不可視の情報を制御するものであると思っていただければよいでしょう。
先のrequest_header.jspでは、クライアントから送信された一連のヘッダ情報を取得してみました。ここでは、サーバ側での処理結果にカスタムのヘッダ情報を付加することで、クライアント側をコントロールしてみることにします。
以下サンプルは、クライアント側の「キャッシュ」を無効化するためのものです。クライアント側ではパフォーマンスを向上させるために、一度読み込んだページをキャッシュと呼ばれる領域に保存し、2度目以降のアクセスで使用するというようなことが行われます。が、時として、そのキャッシュが邪魔をして最新の状態が表示されないというケースが起こり得ます。そこで、データの変動が激しいページにおいては、クライアント側のキャッシュを無効にすることで、そうしたデータの不整合を未然に防ぎます。
<%@ page contentType="text/html;charset=Shift_JIS" import="java.util.*" %> <% Calendar objCal1=Calendar.getInstance(); Calendar objCal2=Calendar.getInstance(); objCal2.set(1970,0,1,0,0,0); response.setDateHeader("Last-Modified",objCal1.getTime().getTime()); response.setDateHeader("Expires",objCal2.getTime().getTime()); response.setHeader("pragma","no-cache"); response.setHeader("Cache-Control","no-cache"); %>
Last-Modifiedヘッダ(コンテンツの最終更新日)には常に今日の日付(Calendarクラスの初期値)を、Expiresヘッダ(有効期限)には「1970/01/01」(過去日)をセットすることで、クライアントに対して常に新しいコンテンツを読み込ませることができます。
pragma、Cache-ControlヘッダはそれぞれHTTP 1.0/1.1仕様のキャッシュ制御用ヘッダです。両ヘッダには「no-cache(キャッシュ無効)」をセットすることで、キャッシュを無効化することが可能です。
クライアントやネットワークの経由に設置されたキャッシュサーバなど、さまざまなキャッシュの仕組みがありますので、これらをすべて無効化するためには、これだけの制御ヘッダを送信しなければならないわけです。
なお、以下にリクエスト/レスポンスに際して主に使用されるヘッダをいくつか挙げておきます。
ヘッダ | 概要 |
---|---|
Accept-Language | 対応言語 |
Connection | 接続の方法 |
Content-Type | コンテンツタイプ(MIME) |
Date | コンテンツの発行日 |
If-Modified-Since | キャッシュの最終更新日 |
Referer | リンク元 |
User-Agent | クライアントの種類 |
WWW-Authenticate | 認証ID/パスワード |
以下のサンプルは、先のrequest_cookie.jspで使用します。request_cookie.jspから送信されたフォーム情報をクッキーに保存し、再びrequest_cookie.jspにリダイレクトします。
クッキーに関する詳細は、requestオブジェクトの項を参照してください。
<%@ page contentType="text/html;charset=Shift_JIS" %> <% Cookie objCok=new Cookie("email",request.getParameter("email")); objCok.setMaxAge(60*60*24*180); response.addCookie(objCok); response.sendRedirect("request_cookie.jsp"); %>
クッキーデータを表し、制御する一連のメソッドを提供するのは、Cookieクラスの役割です。クッキーは、以下の構文で生成することができます。
Cookie 変数=new Cookie(クッキー名,クッキー値);
Cookieクラスの主要なメソッドは以下のとおりです。クッキー名だけは最初に設定した値を変更できない点に注意してください。
メソッド | 概要 |
---|---|
getComment()/setComment(str) | コメントの取得/設定 |
getDomain()/setDomain(str) | 対象ドメインの取得/設定 |
getMaxAge()/setMaxAge(int) | 有効期限の取得/設定(秒) |
getName() | クッキー名の取得 |
getPath()/setPath(str) | 対象パスの取得/設定 |
getSecure()/setSecure(bln) | SSL通信要否の取得/設定 |
getValue()/setValue(str) | クッキー値の取得/設定 |
getVersion()/setVersion(int) | バージョン値の取得/設定 |
生成されたクッキーを実際にクライアントに出力するのは、addCookieメソッドの役割です。addCookieメソッドを介して初めて、生成されたクッキーは有効になります。ちなみに、クッキーの有効期限が0の場合、クッキーはブラウザ終了時に削除されます。負数の場合、指定された既存のクッキーは削除されます。
クッキーをクライアントに送信した後、sendRedirectメソッドは指定されたURLにページをリダイレクトします。
以下に、ここまで紹介したaddCookie、setHeaderメソッドなどのほか、responseオブジェクトに用意されている主なメソッドを挙げておきます。
メソッド | 概要 |
---|---|
addHeader(name,value) | 指定されたヘッダnameを値valueで追加 |
containsHeader(name) | 指定されたヘッダ名nameがすでに発行されているかどうか |
encodeURL | URLにセッションIDを付加 |
encodeRedirectURL | URLにセッションIDを付加(sendRedirectメソッド対応) |
isCommited() | ヘッダが出力済みかどうか |
setContentLength(length) | コンテンツ長lengthをセット |
setStatus(code) | HTTPステータスコードcodeを出力 |
setError(code,msg) | エラーステータスcodeを、エラーメッセージmsgとともに出力 |
Copyright © ITmedia, Inc. All Rights Reserved.