java基础篇---HTTP协议HTTP协议一直是自己的薄弱点,也没抽太多时间去看这方面的内容,今天兴致来了就在网上搜了下关于http协议,发现有园友写了一篇非常好的博文,博文地址:(http://www.cnblogs.com/xdp-gacl/p/3751277.html)作者:孤傲苍狼
一、什么是HTTP协议HTTP是hypertext transfer PRotocol(超文本传输协议)的简写,它是TCP/ip协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通迅的格式。
二、HTTP协议的版本HTTP协议的版本:HTTP/1.0、HTTP/1.1
三、HTTP1.0和HTTP1.1的区别在HTTP1.0协议中,客户端与web服务器建立连接后,只能获得一个web资源。在HTTP1.1协议,允许客户端与web服务器建立连接后,在一个连接上获取多个web资源。
四、HTTP请求4.1、HTTP请求包括的内容客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求。
一个完整的HTTP请求包括如下内容:一个请求行、若干消息头、以及实体内容范例:
4.2、HTTP请求的细节——请求行请求行中的GET称之为请求方式,请求方式有:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT,常用的有: GET、 POST用户如果没有设置,默认情况下浏览器向服务器发送的都是get请求,例如在浏览器直接输地址访问,点超链接访问等都是get,用户如想把请求方式改为post,可通过更改表单的提交方式实现。不管POST或GET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上:如果请求方式为GET方式,则可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔,例如:GET /mail/1.html?name=abc&passWord=xyz HTTP/1.1GET方式的特点:在URL地址后附带的参数是有限制的,其数据容量通常不能超过1K。如果请求方式为POST方式,则可以在请求的实体内容中向服务器发送数据,Post方式的特点:传送的数据量无限制。
4.3、HTTP请求的细节——消息头HTTP请求中的常用消息头
accept:浏览器通过这个头告诉服务器,它所支持的数据类型Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集Accept-Encoding:浏览器通过这个头告诉服务器,支持的压缩格式Accept-Language:浏览器通过这个头告诉服务器,它的语言环境Host:浏览器通过这个头告诉服务器,想访问哪台主机If-Modified-Since: 浏览器通过这个头告诉服务器,缓存数据的时间Referer:浏览器通过这个头告诉服务器,客户机是哪个页面来的 防盗链Connection:浏览器通过这个头告诉服务器,请求完后是断开链接还是何持链接
例如:
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-Excel, application/vnd.ms-Powerpoint, application/msword, */*Referer: http://localhost:8080/JavaWebDemoProject/Web/2.jspAccept-Language: zh-CNUser-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3)Accept-Encoding: gzip, deflateHost: localhost:8080Connection: Keep-Alive
五、HTTP响应5.1、HTTP响应包括的内容一个HTTP响应代表服务器向客户端回送的数据,它包括: 一个状态行、若干消息头、以及实体内容 。
范例:
HTTP/1.1 200 OKServer: Apache-Coyote/1.1Content-Type: text/html;charset=ISO-8859-1Content-Length: 105Date: Tue, 27 May 2014 16:23:28 GMT<html> <head> <title>Hello World JSP</title> </head> <body> Hello World! </body></html>
5.2、HTTP响应的细节——状态行 状态行格式:HTTP版本号状态码原因叙述<CRLF> 举例:HTTP/1.1 200 OK状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为5类,如下所示:
5.3、HTTP响应细节——常用响应头HTTP响应中的常用响应头(消息头)Location: 服务器通过这个头,来告诉浏览器跳到哪里Server:服务器通过这个头,告诉浏览器服务器的型号Content-Encoding:服务器通过这个头,告诉浏览器,数据的压缩格式Content-Length: 服务器通过这个头,告诉浏览器回送数据的长度Content-Language: 服务器通过这个头,告诉浏览器语言环境Content-Type:服务器通过这个头,告诉浏览器回送数据的类型Refresh:服务器通过这个头,告诉浏览器定时刷新Content-Disposition: 服务器通过这个头,告诉浏览器以下载方式打数据Transfer-Encoding:服务器通过这个头,告诉浏览器数据是以分块方式回送的Expires: -1 控制浏览器不要缓存Cache-Control: no-cache Pragma: no-cache
六、在服务端设置响应头来控制客户端浏览器的行为6.1、设置Location响应头,实现请求重定向package gacl.http.study;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * @author gacl * */public class ServletDemo01 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setStatus(302);//设置服务器的响应状态码 /** *设置响应头,服务器通过 Location这个头,来告诉浏览器跳到哪里,这就是所谓的请求重定向 */ response.setHeader("Location", "/JavaWeb_HttpProtocol_Study_20140528/1.jsp"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); }}
当在浏览器中使用URL地址"http://localhost:8080/JavaWeb_HttpProtocol_Study_20140528/servlet/ServletDemo01"访问ServletDemo01时,就可以看到服务器作出响应后发送到浏览器的状态码和响应头信息,如下图所示:
服务器返回一个302状态码告诉浏览器,你要的资源我没有,但是我通过Location响应头告诉你哪里有,而浏览器解析响应头Location后知道要跳转到/JavaWeb_HttpProtocol_Study_20140528/1.jsp页面,所以就会自动跳转到1.jsp,如下图所示:
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