Servlets - 客户请求( Client Request)
当浏览器请求网页时,它会向Web服务器发送大量信息,这些信息无法直接读取,因为此信息作为HTTP请求标头的一部分传播。 您可以检查HTTP协议以获取更多信息。
以下是来自浏览器端的重要标题信息,您将在网络编程中经常使用 -
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 | Authorization 客户端使用此标头在访问受密码保护的网页时标识自己。 |
6 | Connection 此标头指示客户端是否可以处理持久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() 返回包含此请求可用属性名称的Enumeration。 |
3 | Enumeration getHeaderNames() 返回此请求包含的所有标头名称的枚举。 |
4 | Enumeration getParameterNames() 返回String对象的Enumeration,其中包含此请求中包含的参数的名称 |
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头信息的示例。 此方法返回一个Enumeration,其中包含与当前HTTP请求关联的标头信息。
一旦我们有了Enumeration,我们就可以以标准方式循环Enumeration,使用hasMoreElements()方法确定何时停止并使用nextElement()方法获取每个参数名称
// 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);
}
}
现在调用上面的servlet会产生以下结果 -
<h1 align="center">HTTP Header Request Example</h1>
标题名称 | 标题值 |
---|---|
accept | */* |
accept-language | en-us |
user-agent | Mozilla/4.0(兼容; 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 |