简介
HTTP响应头是网站服务器端针对客户的请求发出的一串信息,它可能包含了请求文档的内容类型,文档长度,对内容编码的字符集,日期时间,内容的过期时间,内容的最后修改时间,服务器型号,是否进行缓存等重要信息。了解这些信息对Java的网络编程具有重要的指导意义。
HTTP通信机制
HTTP 使用内容类型,是指Web服务器向Web浏览器返回的文件都有与之相关的类型。所有这些类型在MIME Internet邮件协议上模型化,即Web服务 器告诉Web浏览器该文件所具有的种类,是HTML文档、GIF格式图像、声音文件还是独立的应用程序。大多数Web浏览器都拥有一系列的可配置的辅助应 用程序,它们告诉浏览器应该如何处理Web服务器发送过来的各种内容类型。HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:
(1) 建立TCP连接
在
HTTP 工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的 TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能, 才能进行更层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80
(2) Web浏览器向Web服务器发送请求命令
一旦建立了
TCP连接,Web浏览器就会向Web服务器发送请求命令
例如:
GET/sample/hello.jsp HTTP/1.1
(3) Web浏览器发送请求头信息
浏览器发送其请求命令之后,还要以头信息的形式向
Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。
(4) Web服务器应答
客户机向服务器发出请求后,服务器会客户机回送应答,
HTTP/1.1 200 OK
应答的第一部分是协议的版本号和应答状态码
(5) Web服务器发送应答头信息
正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。
(6) Web服务器向浏览器发送数据
Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据
(7) Web服务器关闭TCP连接
一般情况下,一旦
Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码
Connection:keep-alive。TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
HTTP1.1常见响应码
不论哪个版本,响应码从100到199总表示一个提供信息的相应,200到299总指示成功,300到399表示重定向,400到499表示客户端错误,500到599表示服务器端错误。
下面是一些常见的状态码及其含义
状态码 |
含义 |
100 Continue |
服务器准备接受,允许客户端在请求中发送大量数据之前询问服务器是否将接受该请求 |
200 OK |
请求成功,若是get或post请求,则包含请求数据;若是head请求,则之包含 |
301 Moved Permanently |
资源已经永久移到一个新的URL |
302 Moved Temporarily |
资源暂时移到一个新的URL |
304 Not Modified |
客户端应该从缓存中加载文档 |
403 Forbidden |
服务器理解请求,但有意拒绝处理 |
404 Not Found |
服务器找不到请求资源 |
500 Internal Server Error |
服务器不知道如何处理 |
502 Bad Gateway |
网关或者代理服务器试图完成请求时,接受到一个无效的相应 |
503 Service Unavailable |
服务器暂时无法处理请求,可能是超负荷或维护原因 |
批量获取一些网站的HTTP响应头信息
获取相应头代码:
package demo0808.demo1;
/**
* 现实响应头代码
*/
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class ShowHttpHeaders {
//要查找的网址
private ArrayList<String> websites;
/**
* 构造函数
* @param websites 网站列表
*/
public ShowHttpHeaders(ArrayList<String> websites) {
this.websites=websites;
}
/**
* 获取响应头
* 打印到控制台
*/
public void getHeaders() {
if(websites==null) {
System.err.println("查询网址不能为空!");
return;
}
try {
for(String website:websites) {
System.out.println("----------------网站:"+website+"HTTP响应头---------------");
URL url = new URL(website);
URLConnection connection = url.openConnection();
Map<String, List<String>> headerFields = connection.getHeaderFields();
Set<Entry<String, List<String>>> entrySet = headerFields.entrySet();
Iterator<Entry<String, List<String>>> iterator = entrySet.iterator();
while(iterator.hasNext()) {
Entry<String, List<String>> next = iterator.next();
String key=next.getKey();
List<String> value = next.getValue();
if(key==null)
System.out.println(value.toString());
else
System.out.println(key+":"+value.toString());
}
System.out.println("");
}
} catch ( IOException e) {
System.err.println("无法查询网址!");
}
}
}
测试代码:
package demo0808.demo1;
/**
* 测试代码
*/
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
String web1="http://www.oschina.net/";
String web2="http://news.baidu.com/";
String web3="https://linux.cn/";
String web4="http://www.taobao.com/";
ArrayList<String> websites=new ArrayList<String>();
websites.add(web1);
websites.add(web2);
websites.add(web3);
websites.add(web4);
ShowHttpHeaders showHttpHeaders = new ShowHttpHeaders(websites);
showHttpHeaders.getHeaders();
}
}
测试结果:
----------------网站:http://www.oschina.net/HTTP响应头---------------
[HTTP/1.1 403 Forbidden]
Date:[Sat, 08 Aug 2015 02:35:08 GMT]
Content-Length:[700]
Connection:[keep-alive]
Content-Type:[text/html;charset=UTF-8]
Server:[Tengine/2.1.0]
----------------网站:http://news.baidu.com/HTTP响应头---------------
[HTTP/1.1 200 OK]
P3p:[CP=" OTI DSP COR IVA OUR IND COM "]
Transfer-Encoding:[chunked]
Vary:[Accept-Encoding, Accept-Encoding]
Date:[Sat, 08 Aug 2015 02:35:09 GMT]
Set-Cookie:[BAIDUID=27B1B47C0413E086084F1E668200715A:FG=1; expires=Sun, 07-Aug-16 02:35:09 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1, LOCALGX=%u5E7F%u5DDE%7C%35%34%39%36%7C%u5E7F%u5DDE%7C%35%34%39%36; expires=Sat, 15-Aug-2015 02:35:09 GMT; path=/; domain=.news.baidu.com]
Content-Type:[text/html]
Server:[Apache]
----------------网站:https://linux.cn/HTTP响应头---------------
[HTTP/1.1 200 OK]
Strict-Transport-Security:[max-age=63072000; includeSubdomains; preload]
Transfer-Encoding:[chunked]
Date:[Sat, 08 Aug 2015 02:35:10 GMT]
Set-Cookie:[dx_516d_sid=qADFvF; expires=Sun, 09-Aug-2015 02:35:10 GMT; Max-Age=86400; path=/; domain=.linux.cn; secure, dx_516d_lastact=1439001310%09index.php%09; expires=Sun, 09-Aug-2015 02:35:10 GMT; Max-Age=86400; path=/; domain=.linux.cn; secure, dx_516d_sid=qADFvF; expires=Sun, 09-Aug-2015 02:35:10 GMT; Max-Age=86400; path=/; domain=.linux.cn; secure, dx_516d_lastvisit=1438997710; expires=Mon, 07-Sep-2015 02:35:10 GMT; Max-Age=2592000; path=/; domain=.linux.cn; secure, dx_516d_saltkey=Vp3c3GiK; expires=Mon, 07-Sep-2015 02:35:10 GMT; Max-Age=2592000; path=/; domain=.linux.cn; secure; httponly]
Connection:[keep-alive]
Content-Type:[text/html; charset=utf-8]
Server:[nginx]
X-Content-Type-Options:[nosniff]
----------------网站:http://www.taobao.com/HTTP响应头---------------
[HTTP/1.1 302 Found]
Date:[Sat, 08 Aug 2015 02:35:10 GMT]
Content-Length:[258]
Location:[https://www.taobao.com/]
Set-Cookie:[thw=cn; Path=/; Domain=.taobao.com; Expires=Sun, 07-Aug-16 02:35:10 GMT;]
Connection:[keep-alive]
Content-Type:[text/html]
Server:[Tengine]
来源:oschina
链接:https://my.oschina.net/u/2315247/blog/489430