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