处理HTTP请求头
4668字,阅读需时16分钟
来自课程
课程/专栏

HTTP请求头不同于表单数据,表单数据直接来源于用户,请求头则由浏览器设置,主要包括Accept、Accept-Encoding、Connection、Cookie、Host等信息,这些信息对于Servlet的操作很重要,Servlet需要明确地读取这些请求头,以便使用这些信息。

HTTP请求头主要包括下面的信息:

1、Accept

设置浏览器或其他客户端可以处理的 MIME 类型。image/png 或 image/jpeg 是最常见的两种。

2、Accept-Charset

设置浏览器可以用来显示信息的字符集。例如UTF-8。

3、Accept-Encoding

设置浏览器如何处理的编码类型。gzip 或 compress 是最常见的两种。

4、Accept-Language

设置浏览器可以接受的语言。

5、Authorization

用于客户端在访问受密码保护的网站时识别自己的身份。

6、Connection

设置客户端是否可以处理持久 HTTP 连接。持久连接允许客户端或其他浏览器通过单个请求来检索多个文件。值 Keep-Alive 意味着使用了持续连接。

7、Content-Length

只适用于 POST 请求,并给出 POST 数据的大小(以字节为单位)。

8、Cookie

把之前发送到浏览器的 cookies 返回到服务器。

9、Host

指定原始的 URL 中的主机和端口。

10、If-Modified-Since

表示只有当页面在指定的日期后已更改时,客户端想要的页面。如果没有新的结果可以使用,服务器会发送一个 304 代码,表示 Not Modified 头信息。

11、If-Unmodified-Since

是 If-Modified-Since 的对立面,它指定只有当文档早于指定日期时,操作才会成功。

12、Referer

指示所指向的 Web 页的 URL。例如,如果在网页 1,点击一个链接到网页 2,当浏览器请求网页 2 时,网页 1 的 URL 就会包含在 Referer 头信息中。

13、User-Agent

识别发出请求的浏览器或其他客户端,并可以向不同类型的浏览器返回不同的内容。

使用Servlet读取请求头,需要调用HttpServletRequest对象的getHeader方法,该方法根据传入的请求头名称,返回该名称的值。例如getHeader(“Connection”),返回Connection的信息。

除了getHeader方法,HttpServletRequest对象还提供了一些有用的方法,来访问特定的请求头信息。

Cookie[]  getCookies()

getCookies方法返回一个数组,包含客户端发送该请求的所有的 Cookie 对象。

String getAuthType()

该方法返回用来保护 servlet 的认证方案名,如 BASIC 或 SSL。

String getAuthType()

返回用于保护 Servlet 的身份验证方案的名称,例如,"BASIC" 或 "SSL",如果JSP没有受到保护则返回 null。

int  getContentLength()

该方法返回用于获取请求的 Body 的长度,如果不确定长度,则返回 -1。

String getContentType()

该方法返回content-type头的值,content-type用于定义网络文件的类型和网页的编码。

Enumeration getHeaderNames()

该方法返回一个枚举,包含在该请求中包含的所有的头名。

String getHeader(String name)

该方法以字符串形式返回指定的请求头的值。

String getMethod()

该方法返回请求的 HTTP 方法的名称,例如,GET、POST 或 PUT。

String getParameter(String name)

该方法以字符串形式返回请求参数的值,或者如果参数不存在则返回 null。

String getProtocol()

该方法返回请求协议的名称和版本。

String getQueryString()

该方法返回包含在路径后的请求 URL 中的查询字符串。

String getRemoteAddr()

该方法返回发送请求的客户端的互联网协议(IP)地址。

String getContextPath()

返回指示请求上下文的请求 URI 部分。

HttpSession getSession()

该方法返回与该请求关联的当前 session 会话,或者如果请求没有 session 会话,则创建一个。

HttpSession getSession(boolean create)

该方法返回与该请求关联的当前 HttpSession,或者如果没有当前会话,且创建是真的,则返回一个新的 session 会话。

例1:在Servlet内输出请求头信息

程序清单 ShowHeaders.java

@WebServlet(name="ShowHeaderServlet",urlPatterns= {"/showheader"})
public class ShowHeaders extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        //获取请求头的相关信息
        out.println("getMethod:" + request.getMethod() + "<br/>");
        out.println("getQueryString:" + request.getQueryString() + "<br/>");
        out.println("getProtocol:" + request.getProtocol() + "<br/>");
        out.println("getContextPath" + request.getContextPath() + "<br/>");
        out.println("getPathInfo:" + request.getPathInfo() + "<br/>");
        out.println("getPathTranslated:" + request.getPathTranslated() + "<br/>");
        out.println("getServletPath:" + request.getServletPath() + "<br/>");
        out.println("getRemoteAddr:" + request.getRemoteAddr() + "<br/>");
        out.println("getRemoteHost:" + request.getRemoteHost() + "<br/>");
        out.println("getRemotePort:" + request.getRemotePort() + "<br/>");
        out.println("getLocalAddr:" + request.getLocalAddr() + "<br/>");
        out.println("getLocalName:" + request.getLocalName() + "<br/>");
        out.println("getLocalPort:" + request.getLocalPort() + "<br/>");
        out.println("getServerName:" + request.getServerName() + "<br/>");
        out.println("getServerPort:" + request.getServerPort() + "<br/>");
        out.println("getScheme:" + request.getScheme() + "<br/>");
        out.println("getRequestURL:" + request.getRequestURL() + "<br/>");
    }
}
我要评论
全部评论