Http请求基本形式:
1、请求头部:方法 资源路径 协议与版本
2、请求首部:Http元数据,键值对结构,必须是ASCII字符,关键字不区分大小,值可以区分大小,也可以不区分,
3、空行 /r/n/r/n
4、消息体
Http响应基本形式:
1、状态行:协议/版本、状态码、状态信息,1xx,提供信息;2、2xx,成功;3、3xx重定向;4xx,刻画端错误;5xx,服务端错误
2、首部
3、空行
4 、消息体
Keep-Alive:http1.1版本提供,服务端响应后保持socket打开,在同一个sockst上等待新的请求
Connection: Keep-Alive,默认打开长连接
Java对Keep-Alive的控制:
1、启用/禁用:设置http.keepAlive为true或false,默认true
2、http.maxConnections设置最大socket连接数,默认5
3、设置http.keepAlive.remainingData为true,使Java在放弃连接后完成数据清理工作,默认false
4、设置sun.net.http.errorStram.enableBuffering为true,尝试缓冲4xx、5xx响应的相对小的错误流,从而释放连接,以备重用,默认false
5、设置sun.net.http.errorStram.enableBufferSize为缓冲错误流使用的字节数,默认4096
6、设置sun.net.http.errorStram.enableBufferTimeout为错误流超时前的毫秒数,默认300ms
Http方法
get:获取一个资源的表示,没有副作用
put:将资源的一个表示上传到一致URL的服务器,具有幂等性,即可以重复操作
delete:从指定URL删除一个资源,具有幂等性
post:和put类似,但是没有指定服务器如何处理新提交的数据,post需要用于不能重复的不安全的操作
head:和get类似,但只获取头部信息,多用于调试
options:允许客户端询问服务器如何处理指定资源
trace:回显客户端的请求,多用于调试
Note:不完成提交的所有安全操作应该使用get,需要提交的使用post
Cookie:存储持久的库客户端状态,cookie存在于请求和响应的首部,由服务器发给客户端再有客户端发给服务端,cookie'一般不包含具体数据,只是指示服务器上的数据;cookie只能是非空白ASCII字符,且不也能包含逗号和分号
cookie特点
1、 服务器只能为他直接所属的域设置cookie
2、cookie的默认作用域为原始URL和所有子目录,但是可以使用Path属性给编作用域,但也只能指定作用与某个子树
3、cookie属性的顺序无关紧要,属性之间使用分号隔开,名-值对放在最前面;
4、可以使用Max-Age属性设置最长保留时间(单位 s),使用expires属性设置过期时间
5、可以使用没有值的secure属性知识安全的cookie事务,通过使用没有值的httponly指示浏览器只通过http和https返回cookie,尤其不能使用JavaScript
CookieManager:抽象类java.net.CookieHandler的一个具体子类,默认不打开cookie
启用cookie
CookieManager manager = new CookieManager();
CookieHandler.setDefault(manager);
cookie 接收策略
CookiePolicy.ACCEPT_ALL 接受所有cookie
CookiePolicy.ACCEPT_NONE 不接受cookie
CookiePolicy.Accept_ORIGINAL_SERVER 只接受与之对话的服务器的cookie,不接受第三方cookie
自定义cookie接受策略——实现CookiePolicy接口,然后覆盖public boolean shouleAccept(URI uri, HttpCookie cookie);
例如:不接受来自 .gov的cookie
public class NoGovermentCookie implements CookiePolicy {
public boolean shouldAccept(URI uri, HttpCookie cookie) {
if(uri.getAuthority().toLowerCase().endWith("gov") || cookie.getDomain().toLowerCase().endWidth("gov")) {
retuern fasle;
}
return true;
}
}
存储cookie 使用CookieManager对象的的getCookieStore对象,进而使用CookieStore的add、remove、get等方法
CookieStroe store = manager.getCookieStore();