5、URLConnection(2)
缓存
Web浏览器多年来已知在缓存页面和图片
如果对于与网站的图片每一个页面上重复出现
浏览器一般只会加载一次,将其保存在缓冲中,每次加载的时候会从缓存中重新加载
一些HTTP首部可以控制缓存
一般情况下:
一般认为使用GET通过HTTP访问的页面可以缓存,也应当缓存
使用HTTPS或者POST访问的页面通常不应缓存
HTTP首部可以对此做出调整:
Java的Web缓存
默认情况下,Java并不完成缓存
要安装URL类使用的系统级缓存
ResponseCache
public abstract CacheResponse
get(URI uri, String rqstMethod, Map<String, List<String>> rqstHeaders)
throws IOException;
public abstract CacheRequest put(URI uri, URLConnection conn) throws IOException;
put()方法返回一个CacheRequest对象,包装一个OutputStream
URL将把读取可缓存数据写入这个输出流
CacheRequest是一个抽象类 :
public abstract OutputStream getBody() throws IOException;
public abstract void abort();
子类的getOutputStream()方法应当返回一个OutputStream
指向缓存中的数据库
这个数据库与同时传入put()方法的URI对应
复制出现问题就会调用abort()方法,从缓存中删除这个请求存储的的所有数据
配置连接
URLConnection类有7个保护的实例字段
定义了客户端如何向服务器做出请求
可以通过相关方法进行设置和访问这些数据:
只能在URLConnection连接之前修改这些字段
获取方法和设置昂发定义了所有URLConnection实例的默认行为
1、protected URL url
url指定这个URLConnection连接的URL
构造函数会在创建对象时设置这个字段,此后不能再改变
可以通过getURL()方法获取这个字段的值
2、protected boolean connected
如过连接已经打开值为true
连接关闭则为false
由于创建一个新的URLConnection对象时连接尚未打开,所以初始值为fasle
3、protected boolean allowUserInteraction
是否允许用户交互,默认为false
可以读取和修改该值:
4、protected boolean doInput
URLConnection可以用于读取服务器、写入服务器,同时用于读/写服务器
可以用来读取保护类型booleab字段doInput就为true,否则会false
可以是哟个瓯宁宫方法进行访问和修改这个值
5、protected boolean doOutput
程序可以使用URLConnection将输出发回服务器
可以用于写入、保护类型boolea字段都Output就为true,否则为false
提供了公共的访问和修改方法
6、protected boolean ifModifiedSince
许多客户端会保留以前获取文档的缓存
再次获取可以再缓存中获取
再最后一次获取这个文档之后,服务器上的文档可能改变,需要判断是否有变化,唯一的办法就是询问服务器
提供公共方法进行获取和修改:
7、protected boolean userCaches
禁用缓存,确保每次获取的请求都是最新版本
两个公共方法用于获取和修改这个字段
超时
有4个方法可以查询和修改连接的超时设置
底层的Socket等待远程服务器的响应时间
等待多长时间后会抛出SocketTimeoutException
相关方法:
配置客户端请求HTTP首部
Web服务器可以根据这个信息向不同的客户端提供不同的页面
获取和设置cookie等
每个URLConnection会在首部默认设置一些不同名-值
使用setRequestProperty()方法为HTTP首部增加字段
使用该方法指定的名和值为这个URLConnection的首部增加一个字段
这个放法只能再连接打开之前使用
如果已经打开,会抛异常
getRequestProperty()方法用于返回这个URLConnection所用的HTTP首部中的字段值
HTTP允许一个制定名字的属性有多个值
各个值之间用逗号隔开
addRequestProperty(String key, String value)
用于增加新的属性值
服务器一般会忽略无法识别的首部
HTTP确实对首部字段的名和值的内容进行一些限制
如:名不可包含空白符、值不能包含任何 换行符