以下內容引用自http://wiki.jikexueyuan.com/project/jsp/client-request.html:
當瀏覽器請求一個網頁時,它向Web服務器發送大量的信息,信息不能直接閱讀,因為這些信息作為HTTP請求標題的一部分行進。
以下是來自瀏覽器端的重要的標題,在網絡編程中將會頻繁的使用:
標題 | 描述 |
---|---|
Accept | 該標題指定了瀏覽器或其他客戶可以處理的MIME類型。image/png或image/jpeg的值是兩種最常見的可能性。 |
Accept-Charset | 該標題指定了瀏覽器可以用來顯示信息的字符集。例如iso-8859-1。 |
Accept-Encoding | 這個標題指定了瀏覽器知道如何處理的編碼類型。gzip或compressare的值是兩種最常見的可能性。 |
Accept-Language | 這個標題指定客戶的首選語言,以防Servlet可以產生多個語言的結果。例如英語,美語,俄語等。 |
Authorization | 這個標題是客戶訪問密碼保護的Web頁面時用來識別他們自己的。 |
Connection | 這個標題表明客戶端是否能處理持續的HTTP連接。持續連接允許客戶端或其他瀏覽器用單個請求檢索多個文件。Keep-Alive的值意味着應該使用持續連接 |
Content-Length | 該標題只適用於POST請求和以字節形式給出POST數據的大小。 |
Cookie | 這個標題為之前發送它們到瀏覽器的服務器返回Cookies。 |
Host | 這個標題指定主機和端口正如原始URL給出的一樣。 |
If-Modified-Since | 這個標題表明,客戶只想得到在指定日期后更改的頁面。服務器發送一個代碼,304意味着沒有修改標題如果沒有更新的結果是可用的。 |
If-Unmodified-Since | 這個標題的作用與if-modified–since是相反的;它指定當且僅當文檔比指定的日期要早時,操作應該成功。 |
Referer | 這個標題表示了引用的Web頁面的URL。例如,如果在Web頁面1,點擊一個鏈接到Web頁面2,當瀏覽器請求Web頁面2時,Web頁面1的URL是包含在引用標題中的。 |
User-Agent | 這個標題標識瀏覽器或其他做出請求的客戶,對應不同類型的瀏覽器可以返回不同的內容。 |
一、HttpServletRequest對象
該請求對象是javax.servlet.http. HttpServletRequest對象的一個實例。每次客戶端請求一個頁面時,JSP引擎就會創建一個新的對象來表示這個請求。
請求對象提供方法來獲取HTTP標題信息,包括表單數據,Cookies,HTTP方法等。
有以下重要的方法可用於讀取JSP程序中的HTTP標題。有了HttpServletRequest對象,這些方法都可用的,該對象代表客戶端對網絡服務器的請求。
方法 | 描述 |
---|---|
Cookie[] getCookies() |
返回一個數組,其中包含客戶端用這個請求發送的所有Cookie對象。 |
Enumeration getAttributeNames() |
返回一個枚舉包含此請求可用的屬性的名稱。 |
Enumeration getHeaderNames() |
返回一個這個請求包含的所有標題名稱的枚舉。 |
Enumeration getParameterNames() |
返回一個字符串對象的枚舉,該字符串對象包括包含在此請求中的參數的名稱。 |
HttpSession getSession() |
返回與此請求相關的當前會話,或者如果該請求沒有會話,那么就創建一個。 |
HttpSession getSession(boolean create) |
返回與這個請求相關的當前的HttpSession或,如果沒有當前會話並且create為真,那么返回一個新的會話。 |
Locale getLocale() |
返回客戶會接受內容的首選區域設置,基於所包含的accept–language標題 |
Object getAttribute(String name) |
作為一個對象返回指定屬性的值,如果指定的名稱沒有屬性,返回null。 |
ServletInputStream getInputStream() |
使用ServletInputStream將請求的主體作為二進制數據檢索。 |
String getAuthType() |
返回用於保護Servlet的驗證方案的名稱,例如,“BASIC”或“SSL”,如果JSP沒有被保護,那么返回null |
String getCharacterEncoding() |
返回在該請求內部使用的字符編碼的名稱。 |
String getContentType() |
返回該請求主體的MIME類型,如果不知道類型,返回null。 |
String getContextPath() |
返回表示請求上下文的請求URI的一部分。 |
String getHeader(String name) |
將指定的請求標題的值作為一個字符串返回。 |
String getMethod() |
返回生成該請求的HTTP方法的名稱,比如GET,POST,或PUT。 |
String getParameter(String name) |
將一個請求參數的值作為字符串返回,如果參數不存在,返回null。 |
String getPathInfo() |
返回與客戶端生成請求時發送的URL相關聯的任何額外的路徑信息。 |
String getProtocol() |
返回請求協議的名稱和版本。 |
String getQueryString() |
返回在路徑后包含在請求URL的查詢字符串。 |
String getRemoteAddr() |
返回發送請求的客戶端的互聯網協議(IP)地址。 |
String getRemoteHost() |
返回發送請求的客戶機的全稱。 |
String getRemoteUser() |
如果用戶已經通過身份驗證,就返回發出這一請求的登錄用戶,如果用戶沒有被驗證,那么返回null。 |
String getRequestURI() |
從取決於HTTP請求首行的查詢字符串的協議名稱中返回請求URL的一部分。 |
String getRequestedSessionId() |
返回客戶端指定的會話ID。 |
String getServletPath() |
返回調用JSP的請求URL的部分。 |
String[] getParameterValues(String name) |
返回一個字符串對象數組,其中包含所有的給定的請求參數的值,如果參數不存在,那么返回null。 |
boolean isSecure() |
返回一個布爾值表示是否使用一個安全通道發出了這個請求,比如HTTPS。 |
int getContentLength() |
以字節為單位,返回請求的主體長度並通過輸入流使其可用,如果長度是未知的,那么返回-1。 |
int getIntHeader(String name) |
作為int返回指定請求標題的值。 |
int getServerPort() |
返回收到這個請求的端口號。 |
二、HTTP標題請求實例
下面是使用HttpServletRequest的getHeaderNames()方法讀取HTTP標題信息的實例。該方法返回一個枚舉,包含與當前HTTP請求相關的標題信息。
一旦得到一個枚舉,可以以標准的方式循環枚舉,使用hasMoreElements()方法來確定何時停止,使用nextElement()方法得到每個參數的名字。
<%@ page import="java.io.*,java.util.*" %> <html> <head> <title>HTTP Header Request Example</title> </head> <body> <center> <h2>HTTP Header Request Example</h2> <table width="100%" border="1" align="center"> <tr bgcolor="#949494"> <th>Header Name</th><th>Header Value(s)</th> </tr> <% 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"); } %> </table> </center> </body> </html>
現在把上述代碼添加到main.jsp中並試圖訪問它。這將產生的如下所示的結果:
測試工程:https://github.com/easonjim/5_java_example/tree/master/jspbasics/test4