在本章中,我们将在JSP中讨论和学习客户端请求。当浏览器请求网页时,它会向Web服务器发送大量信息。这些信息不能直接读取,因为这些信息作为HTTP请求标头的一部分。可以通过HTTP协议以了解更多信息。
下表列出了浏览器中的重要HTTP请求头信息。这些信息经常在Web编程中使用 -
编号 | 请求头 | 描述 |
---|---|---|
1 | Accept |
此请求头指定浏览器或其他客户端可以处理的MIME 类型。 image/png 或image/jpeg 是两种最常见的值。 |
2 | Accept-Charset |
此请求头指定浏览器可用于显示信息的字符集。 例如:ISO-8859-1 ,UTF-8 和GB2312 等。 |
3 | Accept-Encoding |
此请求头指定浏览器知道如何处理的编码类型。gzip 或compress 是两种最常见的值。 |
4 | Accept-Language |
此请求头指定客户端的首选语言,以防servlet可以使用多种语言生成结果。例如:en ,en-us ,ru 等 |
5 | Authorization |
访问受密码保护的网页时,客户端使用此请求头来标识自己。 |
6 | Connection |
此请求头指示客户端是否可以处理持久的HTTP连接。 持久连接允许客户端或其他浏览器通过单个请求检索多个文件。如果是Keep-Alive 值表示使用持久连接。 |
7 | Content-Length |
此请求头仅适用于POST 请求,并以字节为单位给出POST 数据的大小。 |
8 | Cookie |
此请求头将返回给先前发送到服务器的cookie 到浏览器。 |
9 | Host |
此请求头指定原始URL中给出的主机和端口。 |
10 | If-Modified-Since |
此请求头表示客户端仅在指定日期之后更改页面。 服务器发送代码304 ,表示如果没有较新的结果可用,则不修改标题。 |
11 | If-Unmodified-Since |
该请求头与If-Modified-Since 相反; 它指定只有当文档比指定日期更早时,动作才能成功。 |
12 | Referer |
此请求头指示引荐网页的URL。 例如,如果位于网页A 并单击链接到网页B ,则当浏览器请求网页B 时,网页A 的URL包含在Referer 标头中。 |
HttpServletRequest对象
request
对象是javax.servlet.http.HttpServletRequest
对象的一个实例。 每当客户端请求页面时,JSP引擎将创建一个新对象来表示该请求。
请求对象提供了获取包括表单数据,Cookie,HTTP方法等HTTP头信息的方法。
下表列出了可用于在JSP程序中读取HTTP头的重要方法。 HttpServletRequest
对象可以使用这些方法,该对象代表Web服务器的客户端请求。
编号 | 方法 | 描述 |
---|---|---|
1 | Cookie[] getCookies() |
返回一个数组,其中包含客户端使用此请求发送的所有Cookie 对象。 |
2 | Enumeration getAttributeNames() |
返回枚举,其中包含此请求可用属性的名称。 |
3 | Enumeration getHeaderNames() |
返回此请求包含的所有头名称的枚举。 |
4 | Enumeration getParameterNames() |
返回此请求中包含的参数名称的String对象的枚举。 |
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) |
以String 形式返回指定的请求头的值。 |
15 | String getMethod() |
返回发出此请求的HTTP方法的名称,例如:GET ,POST 或PUT 。 |
16 | String getParameter(String name) |
以String 形式返回请求参数的值,如果该参数不存在,则返回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() |
返回调用JSP的请求的URL部分。 |
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()
方法来获取每个参数名称的名称。
首先打开Eclipse,创建一个动态Web项目:ClientRequest,其项目结构如下所示 -
创建一个JSP文件:index.jsp,其代码如下所示 -
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>客户端请求参数数据</title>
</head>
<body>
<div style="margin: auto; width: 80%;">
<h2>客户端请求头参数数据示例</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>
</div>
</body>
</html>
执行上面示例代码,打开浏览器访问URL: http://localhost:8080/ClientRequest/index.jsp ,得到以下结果 -