几个HTTP请求报头

来源:互联网 发布:cad3d建模软件 编辑:程序博客网 时间:2024/05/17 03:25

1. 读取所有请求报头

 

    可以用一个enumeration类型来获取所有报头,然后使用enumeration类型中内置的hasMoreElement和nextElement方法来取得所有报头名称,然后使用request.getHeader(报头名)来获取相应报头的值。

 

    Enumeration headerNames = request.getHeaders();

 

    while(headerNames.hasMoreElement()){

 

        String headerName = (String)headerNames.nextElement();

        String headerValue = request.getHeader(headerName);

        ……

    }

 

 

 

2. Accept-Encoding

 

    我们在使用压缩方式传送web数据时,常会用到的一个报头信息。通过它,我们可以知道客户浏览器是否支持某种压缩格式(比如gzip),如果支持则可以使用(gzip)压缩方式来传送数据,让数据更快到达。

 

    String encodings = request.getHeader("Accept-Encoding");

 

    boolean isGzipSupported = (null != encodings) && (-1 != encoding.indexOf("gzip")); // 判断是否支持gzip压缩

 

 

 

3. User-Agent

 

    当你看到网页上显示出你使用的是哪种浏览器时,你会觉得神奇吗?没什们好神奇的,User-Agent报头就包含了这个信息。几乎所有的浏览器都会包含User-Agent的报头信息,通过它我们很容易知道客户使用的是哪种浏览器。

 

    但是使用这个报头要注意几个细节:(1)仅仅在必须时才使用User-Agent,否则代码会变得比较难以维护;(2)使用前要核实该报头是否为null。User-Agent报头并不是Http1.1规范的要求,因此一些浏览器可以设置禁用这个报头,甚至根本就不使用这个报头,所以在使用User-Agent时,应先检查使用为null;(3)区分Netscape和IE要检查MSIE,而非Mozilla;(4)User-Agent报头是可以造假的,有些浏览器可能允许用户修改这个报头的值,因此它的造假是容易的,当然,对这个报头进行造假没什么意义就是了,我个人是这么认为的啦。

 

    User-Agent的使用方式跟Accept-Encoding差不多,就是indexOf(...)多判断一点而已,麻烦。

 

 

 

4. Referer

 

    Referer这个报头似乎不被列在所有报头的范围内,至少我在测试“1. 读取所有请求报头”时,没发现这个报头的信息。这个报头主要是用来判断“用户点击链接到达当前页面时所处页面的位置”,也就是“从哪里进来”的意思啦。使用Referer报头我们可以根据客户到达的方式来定制页面。

 

    值得一提的是,Referer报头可以判断链接是来自于防火墙内部还是外部,或许有人会想说利用这样的技巧我们可以用来保护我们的应用,但是实际在这是不安全的,因为Referer同其他报头一样,易于伪造。

 

    Referer使用方式也跟User-Agent差不多,说到底,其实报头的使用方式都是差不多的。

 

 

5. Connection

 

    这个报头标明客户是否能够处理持续性HTTP连接。持续性连接允许客户或其他浏览器在单个socket中读取多个文件,从而节省协商几个独立连接所需的开销。默认都是持续性连接。

 

 

6. Authorization

 

    在访问密码保护的Web页面时,客户用这个报头来标识自己的身份,这个我个人也还没接触到,不太了解,以后在谈。

 

 

7. Content-Length

 

    Content-Length只适用于POST请求,用来给定POST数据的大小,以字节为单位。它的使用方式比较简单,只需使用request.getContentLength()即可得到该报头的值。但是,表单数据的读取一般由Servlet负责,我们很少会显示地使用这个报头。

 

 

8. If-Modified-Since 和 If-Unmodified-Since

 

    If-Modified-Since标明仅当页面在指定的日期之后发生更改的情况下,客户程序才希望获取该页面。这个报头十分有用,因为使用它,浏览器可以缓存文档,只在它们发生更改时才通过网络重新载入它们。但是,Servlet不需要直接处理这个报头,取而代之,它们应该实现getLastModified方法,让系统自动处理修改日期。

 

    If-Unmodified-Since这个报头刚好和上面的相反,它规定仅当文档比指定的日期要旧时,操作才需要继续。一般来说,If-Modified-Since用在GET请求中,而If-Unmodified-Since用在PUT请求中。

 

 

9. 其他几个报头

 

    Accept-Charset(显示支持的字符集)、Accept-Language(显示支持的语言)、Cookie(一般不会用这个,而是交给serlvet的getCookies处理)、Host(显示主域名)

 

 


--------------------------------------------------------------------------------

参考文献《Servlet与JSP核心编程 第二版》

原创粉丝点击