文档章节

HTTP简介及运用Java获取HTTP响应头

断桥残雪断桥残雪
 断桥残雪断桥残雪
发布于 2015/08/08 10:36
字数 1807
阅读 8549
收藏 85

简介

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]



© 著作权归作者所有

断桥残雪断桥残雪
粉丝 53
博文 139
码字总数 94909
作品 0
广州
程序员
私信 提问
加载中

评论(1)

李学良
李学良
https请求获取不到头信息呀
HTTP请求行、请求头、请求体详解

HTTP请求报文解剖 HTTP请求报文由3部分组成(请求行+请求头+请求体): 下面是一个实际的请求报文: ①是请求方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT...

HeroHY
2017/07/09
87
0
HTTP报文详解

引用 学习Web开发不好好学习HTTP报文,将会“打拳不练功,到老一场空”,你花在犯迷糊上的时间比你沉下心来学习HTTP的时间肯定会多很多。 HTTP请求报文解剖 HTTP请求报文由3部分组成( 请求行...

长平狐
2012/11/28
14.8K
6
2012 版猥琐获得 httponly cookie 权限教程

背景介绍 - 过去 第一次尝试获取到 HttpOnly cookie是通过XST (Cross Site Tracing:跨站跟踪)漏洞. 不久之后开始普及XST,再之后, 浏览器还在XMLHttpRequest中封锁了TRACE方法 (i.e. xmlhttp....

蟋蟀哥哥
2013/01/31
10.8K
17
运用 Java 8 写一个 HTTP请求工具类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangxin09/article/details/86668854 三年多以前写过一个 HTTP 请求类,然后又将其改进为链式风格的调用方式...

sp42a
01/27
0
0
JAVA线程8 - ThreadLocal

一、ThreadLocal简介 ThreadLocal并不是一个Thread,而是Thread的局部变量。 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立...

小米米儿小
2014/02/26
708
0

没有更多内容

加载失败,请刷新页面

加载更多

Vue nodejs商城项目-搭建express框架环境

本文转载于:专业的前端网站➯Vue nodejs商城项目-搭建express框架环境 1.express-project 搭建express框架环境 安装express generator生成器 通过生成器自动创建项目 配置分析 安装 cnpm i -...

前端老手
7分钟前
1
0
maven项目A引入maven项目B的jar包

首先打开 项目B 的 pom 文件,加入如下配置 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin<......

嘴角轻扬30
10分钟前
2
0
一个突然出现的诡异bug

突然从昨天的某个时刻开始,程序报错了,作为接管该项目的我只能从找日志开始:这是打印的日志 日志已经很清楚了,说的的验签或者解密失败了! 好吧,我把代码拉下来瞅瞅,这是打印日志的地方...

布袋和尚_爱吃鱼
16分钟前
2
0
按位与(&)运算符应用实践

按位与运算是将数字转换成二进制格式进行位运算。 1、&的运算方法(奇偶性判断) 整数与“1”进行按位与运算,运算结果为“0”表示为偶数,运算结果为“1”表示为奇数。 <?php//将数组中...

尤金
26分钟前
2
0
java常量池

https://blog.csdn.net/qq_41376740/article/details/80338158

南桥北木
30分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部