正如在前面的章節(jié)中討論的一樣,當(dāng)一個(gè) Web 服務(wù)器對(duì)瀏覽器響應(yīng)一個(gè) HTTP 請(qǐng)求時(shí),響應(yīng)通常包括一個(gè)狀態(tài)行、一些響應(yīng)頭信息、一個(gè)空行和文檔。一個(gè)典型的響應(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)、一個(gè)狀態(tài)碼(例子中的 200)和一個(gè)對(duì)應(yīng)于狀態(tài)碼的短消息(例子中的 OK)。
下面是從 web 服務(wù)器端返回到瀏覽器的最有用的 HTTP 1.1 響應(yīng)頭信息的總結(jié),且在 web 編程中你會(huì)頻繁地使用它們:
頭信息 | 描述 |
---|---|
Allow | 這個(gè)頭信息指定服務(wù)器支持的請(qǐng)求方法(GET、POST 等)。 |
Cache-Control | 這個(gè)頭信息指定響應(yīng)文檔在何種情況下可以安全地緩存。可能的值有:public, private 或 no-cache 等。Public 意味著文檔是可緩存,Private 意味著文檔是單個(gè)用戶(hù)私用文檔,且只能存儲(chǔ)在私有(非共享)緩存中,no-cache 意味著文檔不應(yīng)被緩存。 |
Connection | 這個(gè)頭信息指示瀏覽器是否使用持久 HTTP 連接。值 close 指示瀏覽器不使用持久 HTTP 連接,值 keep-alive 意味著使用持久連接。 |
Content-Disposition | 這個(gè)頭信息可以讓您請(qǐng)求瀏覽器要求用戶(hù)以給定名稱(chēng)的文件把響應(yīng)保存到磁盤(pán)。 |
Content-Encoding | 在傳輸過(guò)程中,這個(gè)頭信息指定頁(yè)面的編碼方式。 |
Content-Language | 這個(gè)頭信息表示文檔編寫(xiě)所使用的語(yǔ)言。例如,en、en-us、ru 等。 |
Content-Length | 這個(gè)頭信息指示響應(yīng)中的字節(jié)數(shù)。只有當(dāng)瀏覽器使用持久(keep-alive)HTTP 連接時(shí)才需要這些信息。 |
Content-Type | 這個(gè)頭信息提供了響應(yīng)文檔的 MIME(Multipurpose Internet Mail Extension)類(lèi)型。 |
Expires | 這個(gè)頭信息指定內(nèi)容過(guò)期的時(shí)間,在這之后內(nèi)容不再被緩存。 |
Last-Modified | 這個(gè)頭信息指示文檔的最后修改時(shí)間。然后,客戶(hù)端可以緩存文件,并在以后的請(qǐng)求中通過(guò) If-Modified-Since 請(qǐng)求頭信息提供一個(gè)日期。 |
Location | 這個(gè)頭信息應(yīng)被包含在所有的帶有狀態(tài)碼的響應(yīng)中。在 300 s 內(nèi),這會(huì)通知瀏覽器文檔的地址。瀏覽器會(huì)自動(dòng)重新連接到這個(gè)位置,并獲取新的文檔。 |
Refresh | 這個(gè)頭信息指定瀏覽器應(yīng)該如何盡快請(qǐng)求更新的頁(yè)面。您可以指定頁(yè)面刷新的秒數(shù)。 |
Retry-After | 這個(gè)頭信息可以與 503(服務(wù)不可用)響應(yīng)配合使用,這會(huì)告訴客戶(hù)端多久就可以重復(fù)它的請(qǐng)求。 |
Set-Cookie | 這個(gè)頭信息指定一個(gè)與頁(yè)面關(guān)聯(lián)的 cookie。 |
下面的方法可用于在 servlet 程序中設(shè)置 HTTP 響應(yīng)頭信息。通過(guò) HttpServletResponse 對(duì)象這些方法是可用的。
序號(hào) | 方法 & 描述 |
---|---|
1 |
String encodeRedirectURL(String url)
為 sendRedirect 方法中使用的指定的 URL 進(jìn)行編碼,或者如果編碼不是必需的,則返回 URL 未改變。 |
2 |
String encodeURL(String url)
對(duì)包含 session 會(huì)話(huà) ID 的指定 URL 進(jìn)行編碼,或者如果編碼不是必需的,則返回 URL 未改變。 |
3 |
boolean containsHeader(String name)
返回一個(gè)布爾值,指示是否已經(jīng)設(shè)置已命名的響應(yīng)頭信息。 |
4 |
boolean isCommitted()
返回一個(gè)布爾值,指示響應(yīng)是否已經(jīng)提交。 |
5 |
void addCookie(Cookie cookie)
把指定的 cookie 添加到響應(yīng)。 |
6 |
void addDateHeader(String name, long date)
添加一個(gè)帶有給定的名稱(chēng)和日期值的響應(yīng)頭信息。 |
7 |
void addHeader(String name, String value)
添加一個(gè)帶有給定的名稱(chēng)和值的響應(yīng)頭信息。 |
8 |
void addIntHeader(String name, int value)
添加一個(gè)帶有給定的名稱(chēng)和整數(shù)值的響應(yīng)頭信息。 |
9 |
void flushBuffer()
強(qiáng)制任何在緩沖區(qū)中的內(nèi)容被寫(xiě)入到客戶(hù)端。 |
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ā)送錯(cuò)誤響應(yīng)到客戶(hù)端,并清除緩沖區(qū)。 |
13 |
void sendError(int sc, String msg)
使用指定的狀態(tài)發(fā)送錯(cuò)誤響應(yīng)到客戶(hù)端。 |
14 |
void sendRedirect(String location)
使用指定的重定向位置 URL 發(fā)送臨時(shí)重定向響應(yīng)到客戶(hù)端。 |
15 |
void setBufferSize(int size)
為響應(yīng)主體設(shè)置首選的緩沖區(qū)大小。 |
16 |
void setCharacterEncoding(String charset)
設(shè)置被發(fā)送到客戶(hù)端的響應(yīng)的字符編碼(MIME 字符集)例如,UTF-8。 |
17 |
void setContentLength(int len)
設(shè)置在 HTTP Servlet 響應(yīng)中的內(nèi)容主體的長(zhǎng)度,該方法設(shè)置 HTTP Content-Length 頭信息。 |
18 |
void setContentType(String type)
如果響應(yīng)還未被提交,設(shè)置被發(fā)送到客戶(hù)端的響應(yīng)的內(nèi)容類(lèi)型。 |
19 |
void setDateHeader(String name, long date)
設(shè)置一個(gè)帶有給定的名稱(chēng)和日期值的響應(yīng)頭信息。 |
20 |
void setHeader(String name, String value)
設(shè)置一個(gè)帶有給定的名稱(chēng)和值的響應(yīng)頭信息。 |
21 |
void setIntHeader(String name, int value)
設(shè)置一個(gè)帶有給定的名稱(chēng)和整數(shù)值的響應(yīng)頭信息。 |
22 |
void setLocale(Locale loc)
如果響應(yīng)還未被提交,設(shè)置響應(yīng)的區(qū)域。 |
23 |
void setStatus(int sc)
為該響應(yīng)設(shè)置狀態(tài)碼。 |
在前面的實(shí)例中你已經(jīng)了解了 setContentType() 方法的工作方式,下面的實(shí)例也會(huì)用到同樣的方法,此外,我們會(huì)用 setIntHeader() 方法來(lái)設(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 秒后就會(huì)顯示當(dāng)前的系統(tǒng)時(shí)間,如下所示。運(yùn)行 servlet 并等著看結(jié)果:
Auto Refresh Header Setting
Current Time is: 9:44:50 PM
更多建議: