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-Moove 意味着应该使用持久连接。
    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对象
    序号 方法和说明
    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 标头,返回客户端将接受内容的首选 Locale。
    8
    Object getAttribute(String 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)
    以字符串形式返回指定请求标头的值。
    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 标头请求示例

    以下是使用的示例 getHeaderNames()HttpServletRequest 方法读取 HTTP 头信息。此方法返回一个枚举,其中包含与当前 HTTP 请求关联的标头信息。
    一旦我们有了枚举,我们就可以以标准方式循环枚举,使用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 将生成以下结果 -
    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-Moove
    cache-control no-cache