Servlets - 客户端 HTTP 请求
当浏览器请求网页时,它会向 Web 服务器发送大量信息,这些信息无法直接读取,因为这些信息作为 HTTP 请求标头的一部分传输。您可以查看 HTTP 协议 以了解更多信息。
以下是来自浏览器端的重要标头信息,在 Web 编程中会经常使用 −
| Sr.No. | 标头 &描述 |
|---|---|
| 1 | Accept 此标头指定浏览器或其他客户端可以处理的 MIME 类型。image/png 或 image/jpeg 值是两种最常见的可能性。 |
| 2 | Accept-Charset 此标头指定浏览器可用于显示信息的字符集。例如 ISO-8859-1。 |
| 3 | Accept-Encoding 此标头指定浏览器知道如何处理的编码类型。gzip 或 compress 值是两种最常见的可能性。 |
| 4 | Accept-Language 此标头指定客户端的首选语言,以防 servlet 可以生成多种语言的结果。例如 en、en-us、ru 等 |
| 5 | 授权 客户端在访问受密码保护的网页时使用此标头来标识自己。 |
| 6 | 连接 此标头指示客户端是否可以处理持久 HTTP 连接。持久连接允许客户端或其他浏览器通过单个请求检索多个文件。 Keep-Alive 的值表示应使用持久连接。 |
| 7 | Content-Length 此标头仅适用于 POST 请求,并以字节为单位提供 POST 数据的大小。 |
| 8 | Cookie 此标头将 cookie 返回到先前将其发送到浏览器的服务器。 |
| 9 | Host 此标头指定原始 URL 中给出的主机和端口。 |
| 10 | If-Modified-Since 此标头表示客户端仅在指定日期后更改页面时才需要该页面。如果没有更新的结果,服务器将发送代码 304,表示 Not Modified 标头。 |
| 11 | If-Unmodified-Since 此标头与 If-Modified-Since 相反;它指定仅当文档早于指定日期时,操作才会成功。 |
| 12 | Referer 此标头指示引用网页的 URL。例如,如果您在网页 1 上单击了网页 2 的链接,则当浏览器请求网页 2 时,网页 1 的 URL 会包含在 Referrer 标头中。 |
| 13 | User-Agent 此标头标识发出请求的浏览器或其他客户端,可用于向不同类型的浏览器返回不同的内容。 |
读取 HTTP 标头的方法
有以下方法可用于在 servlet 程序中读取 HTTP 标头。这些方法可通过 HttpServletRequest 对象使用
| Sr.No. | 方法 &描述 |
|---|---|
| 1 | Cookie[] getCookies() 返回一个数组,其中包含客户端随此请求发送的所有 Cookie 对象。 |
| 2 | Enumeration getAttributeNames() 返回一个枚举,其中包含此请求可用的属性名称。 |
| 3 | Enumeration getHeaderNames() 返回此请求的所有标头名称的枚举包含。 |
| 4 | Enumeration getParameterNames() 返回包含此请求中所含参数名称的字符串对象枚举 |
| 5 | HttpSession getSession() 返回与此请求关联的当前会话,如果请求没有会话,则创建一个会话。 |
| 6 | HttpSession getSession(boolean create) 返回与此请求关联的当前 HttpSession,如果没有当前会话且 create 的值为 true,则返回一个新会话。 |
| 7 | Locale getLocale() 根据 Accept-Language 标头,返回客户端将接受内容的首选语言环境。 |
| 8 | Object getAttribute(String name) 以 Object 形式返回命名属性的值,如果不存在给定名称的属性,则返回 null。 |
| 9 | ServletInputStream getInputStream() 使用 ServletInputStream 将请求主体作为二进制数据检索。 |
| 10 | String getAuthType() 返回用于保护 servlet 的身份验证方案的名称,例如"BASIC"或"SSL",如果 JSP 未受保护,则返回 null。 |
| 11 | String getCharacterEncoding() 返回此请求正文中使用的字符编码的名称。 |
| 12 | String getContentType() 返回请求正文的 MIME 类型,如果类型未知,则返回 null。 |
| 13 | String getContextPath() 返回请求 URI 中指示请求上下文的部分。 |
| 14 | String getHeader(String name) 以字符串形式返回指定请求标头的值。 |
| 15 | String getMethod() 返回发出此请求的 HTTP 方法的名称,例如 GET、POST 或 PUT。 |
| 16 | String getParameter(String name) 以字符串形式返回请求参数的值,如果参数不存在则返回 null。 |
| 17 | String getPathInfo() 返回与客户端发出此请求时发送的 URL 相关的任何额外路径信息 |
| 18 | String getProtocol() 返回请求协议的名称和版本。 |
| 19 | String getQueryString() 返回请求 URL 中路径后的查询字符串。 |
| 20 | String getRemoteAddr() 返回发送请求的客户端的 Internet 协议 (IP) 地址。 |
| 21 | String getRemoteHost() 返回发送请求的客户端的完全限定名称。 |
| 22 | String getRemoteUser() 如果用户已经通过身份验证,则返回发出此请求的用户的登录信息,如果用户尚未通过身份验证,则返回 null。 |
| 23 | String getRequestURI() 返回此请求的 URL 中从协议名称到 HTTP 请求第一行中的查询字符串的部分。 |
| 24 | String getRequestedSessionId() 返回客户端指定的会话 ID。 |
| 25 | String getServletPath() 返回此请求的 URL 中调用 JSP 的部分。 |
| 26 | String[] getParameterValues(String name) 返回包含给定请求参数的所有值的 String 对象数组,如果参数不存在则返回 null。 |
| 27 | boolean isSecure() 返回一个布尔值,指示此请求是否使用安全通道(如 HTTPS)发出。 |
| 28 | int getContentLength() 返回请求主体的长度(以字节为单位),由输入流提供,如果长度未知则返回 -1。 |
| 29 | int getIntHeader(String name) 以 int 形式返回指定请求标头的值。 |
| 30 | int getServerPort() 返回接收此请求的端口号。 |
HTTP 标头请求示例
以下是使用 HttpServletRequest 的 getHeaderNames() 方法读取 HTTP 标头信息的示例。此方法返回一个枚举,其中包含与当前 HTTP 请求相关的标头信息。
一旦我们有了枚举,我们就可以以标准方式循环枚举,使用 hasMoreElements() 方法确定何时停止,并使用 nextElement() 方法获取每个参数名称
// 导入所需的 Java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// 扩展 HttpServlet 类
public class DisplayHeader extends HttpServlet {
// 处理 GET 方法请求的方法。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应内容类型
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\">";
out.println(docType +
"<html>" ++
"<head><title>" + title + "</title></head>
"+
"<body bgcolor = \"#f0f0f0\">" ++
"<h1 align = \"center\">" + title + "</h1>" ++
"<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>
");
String paramValue = request.getHeader(paramName);
out.println("<td> " + paramValue + "</td></tr>
");
}
out.println("</table>
</body></html>");
}
// 处理 POST 方法请求的方法。
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
现在调用上述 servlet 将生成以下结果 −
HTTP 标头请求示例
标头名称 标头值 accept */* accept-language en-us user-agent Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; InfoPath.2; MS-RTC LM 8) accept-encoding gzip, deflate host localhost:8080 connection Keep-Alive cache-control no-cache

