Servlet 伺服器 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、privateno-cache 等。 Public 意味著文檔是可緩存,Private 意味著文檔是單一使用者私人文檔,且只能儲存在私有(非共用)快取中,no-cache 意味著文檔不應被快取。
Connection這個頭資訊指示瀏覽器是否使用持久 HTTP 連線。值 close 指示瀏覽器不使用持久 HTTP 連接,值 keep-alive 表示使用持久連接。
Content-Disposition這個頭資訊可以讓您請求瀏覽器要求使用者以給定名稱的檔案把回應儲存到磁碟。
Content-Encoding在傳輸過程中,這個頭資訊指定頁面的編碼方式。
Content-Language這個頭資訊表示文件編寫所使用的語言。例如,en、en-us、ru 等。
Content-Length這個頭訊息指示回應中的位元組數。只有當瀏覽器使用持久(keep-alive)HTTP 連線時才需要這些資訊。
Content-Type這個頭資訊提供了回應文件的 MIME(Multipurpose Internet Mail Extension)類型。
Expires這個頭資訊指定內容過期的時間,在這之後內容不再被快取。
Last-Modified這個頭資訊指示文件的最後修改時間。然後,客戶端可以快取文件,並在以後的請求中透過 If-Modified-Since 請求頭資訊提供一個日期。
Location這個頭訊息要被包含在所有的有狀態碼的回應中。在 300s 內,這會通知瀏覽器文件的位址。瀏覽器會自動重新連接到這個位置,並取得新的文件。
Refresh這個頭資訊指定瀏覽器應該如何盡快要求更新的頁面。您可以指定頁面刷新的秒數。
Retry-After這個頭資訊可以與503(Service Unavailable 服務不可用)回應配合使用,這會告訴客戶端多久就可以重複它的請求。
Set-Cookie這個頭資訊指定一個與頁面關聯的 cookie。

設定 HTTP 回應標頭的方法

下面的方法可用來在 Servlet 程式中設定 HTTP 回應標頭。這些方法透過 HttpServletResponse 物件可用。

序號方法& 描述
#1String encodeRedirectURL(String url)
為sendRedirect 方法中使用的指定的URL 進行編碼,或者如果編碼不是必需的,則傳回URL 未改變。
2String encodeURL(String url)
對包含session 會話ID 的指定URL 進行編碼,或者如果編碼不是必需的,則傳回URL 未改變。
3boolean containsHeader(String name)
傳回一個布林值,指示是否已經設定已命名的回應標頭。
4boolean isCommitted()
傳回一個布林值,指示回應是否已提交。
5void addCookie(Cookie cookie)
把指定的 cookie 加到回應。
6void addDateHeader(String name, long date)
新增一個帶有給定的名稱和日期值的回應報頭。
7void addHeader(String name, String value)
新增一個帶有給定的名稱和值的回應標頭。
8void addIntHeader(String name, int value)
新增一個帶有給定的名稱和整數值的回應報頭。
9void flushBuffer()
強制任何在緩衝區中的內容被寫入到客戶端。
10void reset()
清除緩衝區中存在的任何數據,包括狀態碼和頭。
11void resetBuffer()
清除回應中基礎緩衝區的內容,不清除狀態碼和頭。
12void sendError(int sc)
使用指定的狀態碼傳送錯誤回應到客戶端,並清除緩衝區。
13void sendError(int sc, String msg)
使用指定的狀態傳送錯誤回應到客戶端。
14void sendRedirect(String location)
使用指定的重定向位置 URL 將暫時重定向回應到用戶端。
15void setBufferSize(int size)
為回應主體設定首選的緩衝區大小。
16void setCharacterEncoding(String charset)
設定被傳送到客戶端的回應的字元編碼(MIME 字元集)例如,UTF-8。
17void setContentLength(int len)
設定在HTTP Servlet 回應中的內容主體的長度,該方法設定HTTP Content-Length 頭。
18void setContentType(String type)
如果回應尚未提交,設定被傳送到客戶端的回應的內容類型。
19void setDateHeader(String name, long date)
設定一個帶有給定的名稱和日期值的回應標頭。
20void setHeader(String name, String value)
設定一個帶有給定的名稱和值的回應標頭。
21void setIntHeader(String name, int value)
設定一個帶有給定的名稱和整數值的回應報頭。
22void setLocale(Locale loc)
如果回應尚未提交,設定回應的區域。
23void setStatus(int sc)
為此回應設定狀態碼。

HTTP Header 回應實例

您已經在前面的實例中看到setContentType() 方法,下面的實例也使用了相同的方法,此外,我們會用setIntHeader() 方法來設定Refresh 頭。

// 导入必需的 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);
  }
}

現在,呼叫上面的 Servlet,每隔 5 秒就會顯示目前系統時間。只要執行Servlet 並稍等片刻,即可看到如下的結果:

#自動刷新Header 設定

目前時間是:9: 44:50 PM

#