Servlet - 客户端HTTP请求



当浏览器请求网页时,它会向Web服务器发送大量信息,这些信息无法直接读取,因为这些信息作为HTTP请求头的部分传输。您可以查看HTTP协议以获取更多信息。

以下是来自浏览器端的重要头部信息,您在Web编程中会经常使用:

序号 头部 & 描述
1

Accept

此头部指定浏览器或其他客户端可以处理的MIME类型。image/pngimage/jpeg是两种最常见的可能性。

2

Accept-Charset

此头部指定浏览器可以使用哪些字符集来显示信息。例如 ISO-8859-1。

3

Accept-Encoding

此头部指定浏览器知道如何处理的编码类型。gzipcompress是两种最常见的可能性。

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
广告