If-Modified-Since & If-None-Match
If-Modified-Since,和 Last-Modified 一样都是用于记录页面最后修改时间的 HTTP 头信息,只是 Last-Modified 是由服务器往客户端发送的 HTTP 头,而 If-Modified-Since 则是由客户端往服务器发送的头,可 以看到,再次请求本地存在的 cache 页面时,客户端会通过 If-Modified-Since 头将先前服务器端发过来的 Last-Modified 最后修改时间戳发送回去,这是为了让服务器端进行验证,通过这个时间戳判断客户端的页面是否是最新的,如果不是最新的,则返回新的内容,如果是最新的,则 返回 304 告诉客户端其本地 cache 的页面是最新的,于是客户端就可以直接从本地加载页面了,这样在网络上传输的数据就会大大减少,同时也减轻了服务器的负担。
If-None-Match,它和ETags(HTTP协议规格说明定义ETag为“被请求变量的实体值”,或者是一个可以与Web资源关联的记号)常用来判断当前请求资源是否改变。类似于Last-Modified和HTTP-IF-MODIFIED-SINCE。但是有所不同的是Last-Modified和HTTP-IF-MODIFIED-SINCE只判断资源的最后修改时间,而ETags和If-None-Match可以是资源任何的任何属性,不如资源的MD5等。
ETags和If-None-Match的工作原理是在HTTP Response中添加ETags信息。当客户端再次请求该资源时,将在HTTP Request中加入If-None-Match信息(ETags的值)。如果服务器验证资源的ETags没有改变(该资源没有改变),将返回一个304状态;否则,服务器将返回200状态,并返回该资源和新的ETags。
ETag如何帮助提升性能?
聪明的服务器开发者会把ETags和GET请求的“If-None-Match”头一起使用,这样可利用客户端(例如浏览器)的缓存。因为服务器首先产生ETag,服务器可在稍后使用它来判断页面是否已经被修改。本质上,客户端通过将该记号传回服务器要求服务器验证其(客户端)缓存。
其过程如下:
1.客户端请求一个页面(A)。
2.服务器返回页面A,并在给A加上一个ETag。
3.客户端展现该页面,并将页面连同ETag一起缓存。
4.客户再次请求页面A,并将上次请求时服务器返回的ETag一起传递给服务器。
5.服务器检查该ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304(未修改——Not Modified)和一个空的响应体。
UAProf全称: User AgentProfile
UAProf主要用于描述终端的性能和优先选择信息,主要是为了让其他设备(比如WAP 网关)能够自动识别终端的能力,从而可以优化传递给终端的内容格式。
UAProf 在包头中用” x-wap-profile”表示。
实现方法:
1: 通过对Android的源码分析,如果是额外的包头信息
例如:x-forwarded-for 客户端连接至服务器的源IP地址
x-forwarded-host 源主机名
可以通过WebVIew.loadUrl(url,extraHeaders)方法添加额外的头信息。
2: android会在真正load一个网页的时候去检查一些特殊的字段,android会去根据WebSettings中得值去重新设置这些字段。
例如:useragent (可以在WebSettings中通过方法设置)
通过以上的分析得到:
1: 如果UAProf不是android的特殊字段,可以通过WebVIew.loadUrl(url,extraHeaders)来添加额外的头信息。
2: 如果UAProf是android的特殊字段,可以通过WebSettings中的方法去设置UAProf的值。
实际结果:
UAProf是android的一个特殊字段,但是在WebSettings也没有字段可以设置。
继续优化:
如果以后找到了这个重新设置UAProf的入口, 就可以通过修改源码来实现自定义UAProf。
一些原因分析:
Android本身就不支持WAP,所以Android隐藏了UAProf的设置。