服務(wù)器端響應(yīng)

2018-08-12 21:19 更新

服務(wù)器 HTTP 響應(yīng)

正如在前面的章節(jié)中討論的一樣,當一個 Web 服務(wù)器對瀏覽器響應(yīng)一個 HTTP 請求時,響應(yīng)通常包括一個狀態(tài)行、一些響應(yīng)頭信息、一個空行和文檔。一個典型的響應(yīng)如下所示:

HTTP/1.1 200 OK
Content-Type: text/html
Header2: ...
...
HeaderN: ...
  (Blank Line)
<!doctype ...>
<html>
<head>...</head>
<body>
...
</body>
</html>

狀態(tài)行包括 HTTP 版本(例子中的 HTTP/1.1)、一個狀態(tài)碼(例子中的 200)和一個對應(yīng)于狀態(tài)碼的短消息(例子中的 OK)。

下面是從 web 服務(wù)器端返回到瀏覽器的最有用的 HTTP 1.1 響應(yīng)頭信息的總結(jié),且在 web 編程中你會頻繁地使用它們:

頭信息 描述
Allow 這個頭信息指定服務(wù)器支持的請求方法(GET、POST 等)。
Cache-Control 這個頭信息指定響應(yīng)文檔在何種情況下可以安全地緩存。可能的值有:public, privateno-cache 等。Public 意味著文檔是可緩存,Private 意味著文檔是單個用戶私用文檔,且只能存儲在私有(非共享)緩存中,no-cache 意味著文檔不應(yīng)被緩存。
Connection 這個頭信息指示瀏覽器是否使用持久 HTTP 連接。值 close 指示瀏覽器不使用持久 HTTP 連接,值 keep-alive 意味著使用持久連接。
Content-Disposition 這個頭信息可以讓您請求瀏覽器要求用戶以給定名稱的文件把響應(yīng)保存到磁盤。
Content-Encoding 在傳輸過程中,這個頭信息指定頁面的編碼方式。
Content-Language 這個頭信息表示文檔編寫所使用的語言。例如,en、en-us、ru 等。
Content-Length 這個頭信息指示響應(yīng)中的字節(jié)數(shù)。只有當瀏覽器使用持久(keep-alive)HTTP 連接時才需要這些信息。
Content-Type 這個頭信息提供了響應(yīng)文檔的 MIME(Multipurpose Internet Mail Extension)類型。
Expires 這個頭信息指定內(nèi)容過期的時間,在這之后內(nèi)容不再被緩存。
Last-Modified 這個頭信息指示文檔的最后修改時間。然后,客戶端可以緩存文件,并在以后的請求中通過 If-Modified-Since 請求頭信息提供一個日期。
Location 這個頭信息應(yīng)被包含在所有的帶有狀態(tài)碼的響應(yīng)中。在 300 s 內(nèi),這會通知瀏覽器文檔的地址。瀏覽器會自動重新連接到這個位置,并獲取新的文檔。
Refresh 這個頭信息指定瀏覽器應(yīng)該如何盡快請求更新的頁面。您可以指定頁面刷新的秒數(shù)。
Retry-After 這個頭信息可以與 503(服務(wù)不可用)響應(yīng)配合使用,這會告訴客戶端多久就可以重復它的請求。
Set-Cookie 這個頭信息指定一個與頁面關(guān)聯(lián)的 cookie。

設(shè)置 HTTP 響應(yīng)頭信息的方法

下面的方法可用于在 servlet 程序中設(shè)置 HTTP 響應(yīng)頭信息。通過 HttpServletResponse 對象這些方法是可用的。

序號 方法 & 描述
1 String encodeRedirectURL(String url)

為 sendRedirect 方法中使用的指定的 URL 進行編碼,或者如果編碼不是必需的,則返回 URL 未改變。

2 String encodeURL(String url)

對包含 session 會話 ID 的指定 URL 進行編碼,或者如果編碼不是必需的,則返回 URL 未改變。

3 boolean containsHeader(String name)

返回一個布爾值,指示是否已經(jīng)設(shè)置已命名的響應(yīng)頭信息。

4 boolean isCommitted()

返回一個布爾值,指示響應(yīng)是否已經(jīng)提交。

5 void addCookie(Cookie cookie)

把指定的 cookie 添加到響應(yīng)。

6 void addDateHeader(String name, long date)

添加一個帶有給定的名稱和日期值的響應(yīng)頭信息。

7 void addHeader(String name, String value)

添加一個帶有給定的名稱和值的響應(yīng)頭信息。

8 void addIntHeader(String name, int value)

添加一個帶有給定的名稱和整數(shù)值的響應(yīng)頭信息。

9 void flushBuffer()

強制任何在緩沖區(qū)中的內(nèi)容被寫入到客戶端。

10 void reset()

清除緩沖區(qū)中存在的任何數(shù)據(jù),包括狀態(tài)碼和頭信息。

11 void resetBuffer()

清除響應(yīng)中基礎(chǔ)緩沖區(qū)的內(nèi)容,不清除狀態(tài)碼和頭信息。

12 void sendError(int sc)

使用指定的狀態(tài)碼發(fā)送錯誤響應(yīng)到客戶端,并清除緩沖區(qū)。

13 void sendError(int sc, String msg)

使用指定的狀態(tài)發(fā)送錯誤響應(yīng)到客戶端。

14 void sendRedirect(String location)

使用指定的重定向位置 URL 發(fā)送臨時重定向響應(yīng)到客戶端。

15 void setBufferSize(int size)

為響應(yīng)主體設(shè)置首選的緩沖區(qū)大小。

16 void setCharacterEncoding(String charset)

設(shè)置被發(fā)送到客戶端的響應(yīng)的字符編碼(MIME 字符集)例如,UTF-8。

17 void setContentLength(int len)

設(shè)置在 HTTP Servlet 響應(yīng)中的內(nèi)容主體的長度,該方法設(shè)置 HTTP Content-Length 頭信息。

18 void setContentType(String type)

如果響應(yīng)還未被提交,設(shè)置被發(fā)送到客戶端的響應(yīng)的內(nèi)容類型。

19 void setDateHeader(String name, long date)

設(shè)置一個帶有給定的名稱和日期值的響應(yīng)頭信息。

20 void setHeader(String name, String value)

設(shè)置一個帶有給定的名稱和值的響應(yīng)頭信息。

21 void setIntHeader(String name, int value)

設(shè)置一個帶有給定的名稱和整數(shù)值的響應(yīng)頭信息。

22 void setLocale(Locale loc)

如果響應(yīng)還未被提交,設(shè)置響應(yīng)的區(qū)域。

23 void setStatus(int sc)

為該響應(yīng)設(shè)置狀態(tài)碼。

HTTP 頭信息響應(yīng)實例

在前面的實例中你已經(jīng)了解了 setContentType() 方法的工作方式,下面的實例也會用到同樣的方法,此外,我們會用 setIntHeader() 方法來設(shè)置 Refresh 頭信息。

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// Extend HttpServlet class
public class Refresh extends HttpServlet {
  // Method to handle GET method request.
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // Set refresh, autoload time as 5 seconds
      response.setIntHeader("Refresh", 5); 
      // Set response content type
      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 = "Auto Refresh Header Setting";
      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>Current Time is: " + CT + "</p>\n");
  }
  // Method to handle POST method request.
  public void doPost(HttpServletRequest request,
                     HttpServletResponse response)
      throws ServletException, IOException {
     doGet(request, response);
  }
}

現(xiàn)在調(diào)用上述 servlet,每 5 秒后就會顯示當前的系統(tǒng)時間,如下所示。運行 servlet 并等著看結(jié)果:

Auto Refresh Header Setting

Current Time is: 9:44:50 PM

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號