客戶端請(qǐng)求

2018-08-12 21:19 更新

客戶端 HTTP 請(qǐng)求

當(dāng)瀏覽器請(qǐng)求網(wǎng)頁時(shí),它會(huì)向 web 服務(wù)器發(fā)送大量信息,這些信息不能被直接讀取,因?yàn)檫@些信息是作為 HTTP 請(qǐng)求頭的一部分行進(jìn)的。

以下是來自瀏覽器端的重要的頭信息,你會(huì)在 web 編程中頻繁的使用:

頭信息 描述
Accept 這個(gè)頭信息指定瀏覽器或其他客戶端可以處理的 MIME 類型。值 image/pngimage/jpeg 是最常見的兩種可能值。
Accept-Charset 這個(gè)頭信息指定瀏覽器可以用來顯示信息的字符集。例如 ISO-8859-1。
Accept-Encoding 這個(gè)頭信息指定瀏覽器知道如何處理的編碼類型。值 gzipcompress 是最常見的兩種可能值。
Accept-Language 這個(gè)頭信息指定客戶端的首選語言,在這種情況下,Servlet 會(huì)產(chǎn)生多種語言的結(jié)果。例如,en、en-us、ru 等。
Authorization 這個(gè)頭信息用于客戶端在訪問受密碼保護(hù)的網(wǎng)頁時(shí)識(shí)別自己的身份。
Connection 這個(gè)頭信息指示客戶端是否可以處理持久 HTTP 連接。持久連接允許客戶端或其他瀏覽器通過單個(gè)請(qǐng)求來檢索多個(gè)文件。值 Keep-Alive 意味著使用了持續(xù)連接。
Content-Length 這個(gè)頭信息只適用于 POST 請(qǐng)求,并給出 POST 數(shù)據(jù)的大小(以字節(jié)為單位)。
Cookie 這個(gè)頭信息把之前發(fā)送到瀏覽器的 cookies 返回到服務(wù)器。
Host 這個(gè)頭信息指定原始的 URL 中的主機(jī)和端口。
If-Modified-Since 這個(gè)頭信息表示只有當(dāng)頁面在指定的日期后已更改時(shí),客戶端想要的頁面。如果沒有新的結(jié)果可以使用,服務(wù)器會(huì)發(fā)送一個(gè) 304 代碼,表示 Not Modified 頭信息。
If-Unmodified-Since 這個(gè)頭信息是 If-Modified-Since 的對(duì)立面,它指定只有當(dāng)文檔早于指定日期時(shí),操作才會(huì)成功。
Referer 這個(gè)頭信息指示所指向的 Web 頁的 URL。例如,如果您在網(wǎng)頁 1,點(diǎn)擊一個(gè)鏈接到網(wǎng)頁 2,當(dāng)瀏覽器請(qǐng)求網(wǎng)頁 2 時(shí),網(wǎng)頁 1 的 URL 就會(huì)包含在 Referer 頭信息中。
User-Agent 這個(gè)頭信息識(shí)別發(fā)出請(qǐng)求的瀏覽器或其他客戶端,并可以向不同類型的瀏覽器返回不同的內(nèi)容。

讀取 HTTP 頭信息的方法

下述方法可以用于讀取 servlet 程序中的 HTTP 頭信息。通過 HttpServletRequest 對(duì)象這些方法是可用的。

序號(hào) 方法 & 描述
1

Cookie[] getCookies()

返回一個(gè)數(shù)組,包含客戶端發(fā)送該請(qǐng)求的所有的 Cookie 對(duì)象。

2

Enumeration getAttributeNames()

返回一個(gè)枚舉,包含提供給該請(qǐng)求可用的屬性名稱。

3

Enumeration getHeaderNames()

返回一個(gè)枚舉,包含在該請(qǐng)求中包含的所有的頭名。

4

Enumeration getParameterNames()

返回一個(gè) String 對(duì)象的枚舉,包含在該請(qǐng)求中包含的參數(shù)的名稱。

5

HttpSession getSession()

返回與該請(qǐng)求關(guān)聯(lián)的當(dāng)前 session 會(huì)話,或者如果請(qǐng)求沒有 session 會(huì)話,則創(chuàng)建一個(gè)。

6

HttpSession getSession(boolean create)

返回與該請(qǐng)求關(guān)聯(lián)的當(dāng)前 HttpSession,或者如果沒有當(dāng)前會(huì)話,且創(chuàng)建是真的,則返回一個(gè)新的 session 會(huì)話。

7

Locale getLocale()

基于 Accept-Language 頭,返回客戶端接受內(nèi)容的首選的區(qū)域設(shè)置。

8

Object getAttribute(String name)

以對(duì)象形式返回已命名屬性的值,如果沒有給定名稱的屬性存在,則返回 null。

9

ServletInputStream getInputStream()

使用 ServletInputStream,以二進(jìn)制數(shù)據(jù)形式檢索請(qǐng)求的主體。

10

String getAuthType()

返回用于保護(hù) Servlet 的身份驗(yàn)證方案的名稱,例如,“BASIC” 或 “SSL”,如果JSP沒有受到保護(hù)則返回 null。

11

String getCharacterEncoding()

返回請(qǐng)求主體中使用的字符編碼的名稱。

12

String getContentType()

返回請(qǐng)求主體的 MIME 類型,如果不知道類型則返回 null。

13

String getContextPath()

返回指示請(qǐng)求上下文的請(qǐng)求 URI 部分。

14

String getHeader(String name)

以字符串形式返回指定的請(qǐng)求頭的值。

15

String getMethod()

返回請(qǐng)求的 HTTP 方法的名稱,例如,GET、POST 或 PUT。

16

String getParameter(String name)

以字符串形式返回請(qǐng)求參數(shù)的值,或者如果參數(shù)不存在則返回 null。

17

String getPathInfo()

當(dāng)請(qǐng)求發(fā)出時(shí),返回與客戶端發(fā)送的 URL 相關(guān)的任何額外的路徑信息。

18

String getProtocol()

返回請(qǐng)求協(xié)議的名稱和版本。

19

String getQueryString()

返回包含在路徑后的請(qǐng)求 URL 中的查詢字符串。

20

String getRemoteAddr()

返回發(fā)送請(qǐng)求的客戶端的互聯(lián)網(wǎng)協(xié)議(IP)地址。

21

String getRemoteHost()

返回發(fā)送請(qǐng)求的客戶端的完全限定名稱。

22

String getRemoteUser()

如果用戶已通過身份驗(yàn)證,則返回發(fā)出請(qǐng)求的登錄用戶,或者如果用戶未通過身份驗(yàn)證,則返回 null。

23

String getRequestURI()

從協(xié)議名稱直到 HTTP 請(qǐng)求的第一行的查詢字符串中,返回該請(qǐng)求的 URL 的一部分。

24

String getRequestedSessionId()

返回由客戶端指定的 session 會(huì)話 ID。

25

String getServletPath()

返回調(diào)用 JSP 的請(qǐng)求的 URL 的一部分。

26

String[] getParameterValues(String name)

返回一個(gè)字符串對(duì)象的數(shù)組,包含所有給定的請(qǐng)求參數(shù)的值,如果參數(shù)不存在則返回 null。

27

boolean isSecure()

返回一個(gè)布爾值,指示請(qǐng)求是否使用安全通道,如 HTTPS。

28

int getContentLength()

以字節(jié)為單位返回請(qǐng)求主體的長度,并提供輸入流,或者如果長度未知?jiǎng)t返回 -1。

29

int getIntHeader(String name)

返回指定的請(qǐng)求頭的值為一個(gè) int 值。

30

int getServerPort()

返回接收到這個(gè)請(qǐng)求的端口號(hào)。

HTTP 頭信息請(qǐng)求實(shí)例:

下述例子使用了 HttpServletRequest 的 getHeaderNames() 方法來讀取 HTTP 頭信息。該方法返回了一個(gè)枚舉,包含與當(dāng)前的 HTTP 請(qǐng)求相關(guān)的頭信息。

一旦我們得到一個(gè)枚舉,我們可以以標(biāo)準(zhǔn)方式循環(huán)這個(gè)枚舉,使用 hasMoreElements() 方法來確定何時(shí)停止循環(huán),使用 nextElement() 方法來獲取每個(gè)參數(shù)的名稱。

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// Extend HttpServlet class
public class DisplayHeader extends HttpServlet {
  // Method to handle GET method request.
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // Set response content type
      response.setContentType("text/html"); 
      PrintWriter out = response.getWriter();
      String title = "HTTP Header Request Example";
      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" +
        "<table width=\"100%\" border=\"1\" align=\"center\">\n" +
        "<tr bgcolor=\"#949494\">\n" +
        "<th>Header Name</th><th>Header Value(s)</th>\n"+
        "</tr>\n"); 
      Enumeration headerNames = request.getHeaderNames();      
      while(headerNames.hasMoreElements()) {
         String paramName = (String)headerNames.nextElement();
         out.print("<tr><td>" + paramName + "</td>\n");
         String paramValue = request.getHeader(paramName);
         out.println("<td> " + paramValue + "</td></tr>\n");
      }
      out.println("</table>\n</body></html>");
  }
  // Method to handle POST method request.
  public void doPost(HttpServletRequest request,
                     HttpServletResponse response)
      throws ServletException, IOException {
     doGet(request, response);
  }
}

現(xiàn)在,調(diào)用上述 servlet 會(huì)產(chǎn)生如下所示的結(jié)果:

HTTP Header Request Example

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)