- Servlet 教程
- Servlet - 首页
- Servlet - 概述
- Servlet - 环境设置
- Servlet - 生命周期
- Servlet - 示例
- Servlet - 表单数据
- Servlet - 客户端请求
- Servlet - 服务端响应
- Servlet - HTTP状态码
- Servlet - 编写过滤器
- Servlet - 异常处理
- Servlet - Cookie处理
- Servlet - Session跟踪
- Servlet - 数据库访问
- Servlet - 文件上传
- Servlet - 日期处理
- Servlet - 页面重定向
- Servlet - 点击计数器
- Servlet - 自动刷新
- Servlet - 发送邮件
- Servlet - 打包
- Servlet - 调试
- Servlet - 国际化
- Servlet - 注解
- Servlet 有用资源
- Servlet - 问答
- Servlet - 快速指南
- Servlet - 有用资源
- Servlet - 讨论
Servlet - 客户端HTTP请求
当浏览器请求网页时,它会向Web服务器发送大量信息,这些信息无法直接读取,因为这些信息作为HTTP请求头的部分传输。您可以查看HTTP协议以获取更多信息。
以下是来自浏览器端的重要头部信息,您在Web编程中会经常使用:
序号 | 头部 & 描述 |
---|---|
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中指定的host和port。 |
10 | If-Modified-Since 此头部指示客户端仅在指定日期之后更改页面才需要该页面。如果没有任何更新的结果,服务器会发送代码304,表示未修改。 |
11 | If-Unmodified-Since 此头部与If-Modified-Since相反;它指定只有当文档早于指定日期时,操作才能成功。 |
12 | Referer 此头部指示引用网页的URL。例如,如果您在网页1上,并点击指向网页2的链接,则当浏览器请求网页2时,网页1的URL将包含在Referer头部中。 |
13 | User-Agent 此头部标识发出请求的浏览器或其他客户端,并可用于向不同类型的浏览器返回不同的内容。 |
读取HTTP头部的方法
在servlet程序中可以使用以下方法读取HTTP头部。这些方法可用于HttpServletRequest对象
序号 | 方法 & 描述 |
---|---|
1 | Cookie[] getCookies() 返回一个包含客户端随此请求发送的所有Cookie对象的数组。 |
2 | Enumeration getAttributeNames() 返回一个包含此请求可用的属性名称的Enumeration。 |
3 | Enumeration getHeaderNames() 返回此请求包含的所有头部名称的枚举。 |
4 | Enumeration getParameterNames() 返回一个包含此请求中包含的参数名称的String对象的枚举。 |
5 | HttpSession getSession() 返回与此请求关联的当前会话,或者如果请求没有会话,则创建一个新会话。 |
6 | HttpSession getSession(boolean create) 返回与此请求关联的当前HttpSession,或者如果没有当前会话并且create的值为true,则返回一个新的会话。 |
7 | Locale getLocale() 根据Accept-Language头部返回客户端将接受内容的首选Locale。 |
8 | Object getAttribute(String name) 返回值为名为name的属性的对象,如果不存在给定名称的属性,则返回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() 返回发送请求的客户端的互联网协议(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请求关联的头部信息的Enumeration。
一旦我们有了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将生成以下结果:
HTTP Header Request Example
Header Name Header Value(s) 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