サーブレットサーバーのHTTPレスポンス
前の章で説明したように、Web サーバーが HTTP リクエストに応答するとき、その応答には通常、ステータス行、いくつかの応答ヘッダー、空白行、およびドキュメントが含まれます。典型的な応答は次のようになります:
HTTP/1.1 200 OK Content-Type: text/html Header2: ... ... HeaderN: ... (Blank Line) <!doctype ...> <html> <head>...</head> <body> ... </body> </html>
ステータス行には、HTTP バージョン (この場合は HTTP/1.1)、ステータス コード (この場合は 200)、およびステータス コードに対応する短いメッセージ (この場合は OK) が含まれます。例)。
次の表は、Web サーバーからブラウザに返される最も便利な HTTP 1.1 応答ヘッダーをまとめたもので、Web プログラミングで頻繁に使用されます。
ヘッダー情報 | 説明 |
---|---|
Allow | このヘッダー情報は、サーバーがサポートするリクエストメソッド (GET、POST など) を指定します。 |
Cache-Control | このヘッダーは、応答ドキュメントを安全にキャッシュできる状況を指定します。可能な値は、public、private、または no-cache などです。パブリックはドキュメントがキャッシュ可能であることを意味し、プライベートはドキュメントが 1 人のユーザーにプライベートであり、プライベート (非共有) キャッシュにのみ保存できることを意味し、キャッシュなしはドキュメントをキャッシュすべきではないことを意味します。 |
Connection | このヘッダーは、ブラウザが永続的な HTTP 接続を使用するかどうかを示します。値 close はブラウザーに永続的な HTTP 接続を使用しないように指示し、値 keep-alive は永続的な接続を使用することを意味します。 |
Content-Disposition | このヘッダーを使用すると、ユーザーに応答を指定された名前のファイルにディスクに保存するようブラウザーに要求できます。 |
Content-Encoding | 送信プロセス中、このヘッダー情報はページのエンコード方式を指定します。 |
Content-Language | このヘッダー情報は、ドキュメントの作成に使用される言語を示します。たとえば、en、en-us、ru などです。 |
Content-Length | このヘッダーは、応答内のバイト数を示します。この情報は、ブラウザが永続的な (キープアライブ) HTTP 接続を使用する場合にのみ必要です。 |
Content-Type | このヘッダー情報は、応答ドキュメントの MIME (MultiPurpose Internet Mail Extension) タイプを提供します。 |
Expires | このヘッダーは、コンテンツの有効期限が切れる時間を指定します。その後、コンテンツはキャッシュされなくなります。 |
Last-Modified | このヘッダー情報は、ドキュメントの最終変更時刻を示します。その後、クライアントはファイルをキャッシュし、今後のリクエストで If-Modified-Since リクエスト ヘッダーを介して日付を提供できます。 |
Location | このヘッダーは、ステータス コードを持つすべての応答に含める必要があります。 300 秒以内に、ブラウザにドキュメントのアドレスが通知されます。ブラウザは自動的にこの場所に再接続し、新しいドキュメントを取得します。 |
Refresh | このヘッダーは、ブラウザーが更新されたページをできるだけ早くリクエストする方法を指定します。ページを更新する秒数を指定できます。 |
Retry-After | このヘッダーは、503 (Service Unavailable) 応答と組み合わせて使用でき、クライアントにリクエストをどれだけ早く繰り返すことができるかを通知します。 |
Set-Cookie | このヘッダーは、ページに関連付けられた Cookie を指定します。 |
HTTPレスポンスヘッダーを設定するメソッド
以下のメソッドは、サーブレットプログラムでHTTPレスポンスヘッダーを設定するために使用できます。これらのメソッドは、HttpServletResponse オブジェクトを通じて利用できます。
シリアル番号 | メソッドと説明 |
---|---|
1 | String encodeRedirectURL(String url) sendRedirect メソッドで使用される指定された URL をエンコードします。エンコードが必要ない場合は、URL を変更せずに返します。 |
2 | String encodeURL(String url) セッション ID を含む指定された URL をエンコードするか、エンコードが必要ない場合は URL を変更せずに返します。 |
3 | boolean containsHeader(String name) 指定された応答ヘッダーが設定されているかどうかを示すブール値を返します。 |
4 | boolean isCommitted() 応答がコミットされたかどうかを示すブール値を返します。 |
5 | void addCookie(Cookie cookie) 指定された Cookie を応答に追加します。 |
6 | void addDateHeader(String name, long date) 指定された名前と日付値を持つ応答ヘッダーを追加します。 |
7 | void addHeader(String name, String value) 指定された名前と値を持つ応答ヘッダーを追加します。 |
8 | void addIntHeader(String name, int value) 指定された名前と int 値を持つ応答ヘッダーを追加します。 |
9 | void flashBuffer() バッファ内の内容を強制的にクライアントに書き込みます。 |
10 | void replace() ステータス コードやヘッダーを含む、バッファー内に存在するデータをすべてクリアします。 |
11 | void replaceBuffer() 応答内の基礎となるバッファーの内容をクリアしますが、ステータス コードとヘッダーはクリアしません。 |
12 | void sendError(int sc) 指定されたステータス コードを使用してクライアントにエラー応答を送信し、バッファをクリアします。 |
13 | void sendError(int sc, String msg) 指定されたステータスを使用してクライアントにエラー応答を送信します。 |
14 | void sendRedirect(String location) 指定されたリダイレクト場所の URL を使用して、一時的なリダイレクト応答をクライアントに送信します。 |
15 | void setBufferSize(int size) 応答本文の優先バッファ サイズを設定します。 |
16 | void setCharacterEncoding(String charset) クライアントに送信される応答の文字エンコーディング (MIME charset) を設定します。たとえば、UTF-8 です。 |
17 | void setContentLength(int len) HTTP サーブレット応答のコンテンツ本文の長さを設定します。このメソッドは、HTTP Content-Length ヘッダーを設定します。 |
18 | void setContentType(String type) 応答がまだ送信されていない場合に、クライアントに送信される応答のコンテンツ タイプを設定します。 |
19 | void setDateHeader(文字列名、長い日付) 指定された名前と日付値を使用して応答ヘッダーを設定します。 |
20 | void setHeader(String name, String value) 指定された名前と値で応答ヘッダーを設定します。 |
21 | void setIntHeader(String name, int value) 指定された名前と int 値を使用して応答ヘッダーを設定します。 |
22 | void setLocale(Locale loc) 応答がまだ送信されていない場合は、応答の地域を設定します。 |
23 | void setStatus(int sc) このレスポンスのステータス コードを設定します。 |
HTTPヘッダー応答の例
前の例でsetContentType()メソッドを確認しましたが、次の例でも同じメソッドを使用します。さらに、setIntHeader()メソッドを使用して設定します。 ヘッダーを更新します。
// 导入必需的 java 库 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; // 扩展 HttpServlet 类 public class Refresh extends HttpServlet { // 处理 GET 方法请求的方法 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置刷新自动加载时间为 5 秒 response.setIntHeader("Refresh", 5); // 设置响应内容类型 response.setContentType("text/html"); // Get current time Calendar calendar = new GregorianCalendar(); String am_pm; int hour = calendar.get(Calendar.HOUR); int minute = calendar.get(Calendar.MINUTE); int second = calendar.get(Calendar.SECOND); if(calendar.get(Calendar.AM_PM) == 0) am_pm = "AM"; else am_pm = "PM"; String CT = hour+":"+ minute +":"+ second +" "+ am_pm; PrintWriter out = response.getWriter(); String title = "自动刷新 Header 设置"; String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n"+ "<body bgcolor=\"#f0f0f0\">\n" + "<h1 align=\"center\">" + title + "</h1>\n" + "<p>当前时间是:" + CT + "</p>\n"); } // 处理 POST 方法请求的方法 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }さて、上記のサーブレットを呼び出すと、現在のシステム時間が 5 秒ごとに表示されます。サーブレットを実行して少し待つと、次の結果が表示されます:
ヘッダー設定を自動的に更新します現在の時刻は: 9:44:50 PM |