HTTP协议简介
1.WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议。
2.HTTP是HyperText Transfer Protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于描述客户端与服务器间的数据传递。
3.HTTP的版本有1.0和1.1
1.0的特点:每次请求服务器上的资源都要建立新的连接,响应完毕后会关闭连接,是无状态的协议。
1.1的特点:在一次TCP/IP连接的基础上可以发出多次请求和得到多次的响应。比1.0多了一些请求和响应头。
HTTP协议的组成部分
1.请求部分
GET /App1/1.html HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Host: localhost:8080
Connection: Keep-Alive
username=admin&password=123
请求部分由三个部分组成:
请求行:位于第一行
请求消息头:从第二行开始至第一个空行结束
请求正文:从第一个空行之后的都是正文
2.响应部分
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Accept-Ranges: bytes
ETag: W/"65-1366335797484"
Last-Modified: Fri, 19 Apr 2013 01:43:17 GMT
Content-Type: text/html
Content-Length: 65
Date: Fri, 19 Apr 2013 02:06:23 GMT
hello http
<a href="b.html">click</a>
<img src="1.jpg"/>
响应部分由三部分组成的:
响应行:位于第一行
响应消息头:从第二行开始至第一个空行结束
响应正文:从第一个空行之后的都是正文
HTTP协议详解
1.请求行:GET /App1/1.html HTTP/1.1
GET:请求方式。默认的请求方式。其他常用的请求方式还有POST。
GET的特点:默认的请求方式。
/App1/c.html?username=sdsfds&password=234324
把表单的请求的数据放在了请求的URI的后面。
缺点:暴露数据、请求行长度有限。
POST的特点:借助HTML中的form表单。
请求参数出现在正文部分。长度没有限制,相对安全。
/App1/1.html:请求的资源的URI
HTTP/1.1:客户端使用的协议的版本
2.响应行:HTTP/1.1 200 OK
HTTP/1.1:服务器使用的版本协议
200:响应码。代表服务器处理的结果的一种表示
200:正常
302/307:重定向
304:服务器的资源没有被修改
404:请求的资源不存在
500:服务器出错了
OK:响应码描述
3.请求消息头:向服务器传递附加信息
Accept:通知服务器,浏览器可以接受的MIME类型。
Accept-Charset:通知服务器,浏览器支持的字符集
Accept-Encoding:通知服务器,浏览器能够解码的数据压缩方式。比如:gzip
Accept-language:通知服务器,所希望的语言
Host:请求的主机和端口
Referer:是一个URL地址。取值是当前页面之前的那个页面的地址。防盗链
Content-Type:通知服务器,请求正文的MIME类型。
If-Modified-Since:通知服务器,缓存的文件的最后修改时间。
User-Agent:通知服务器,浏览器类型
Content-Length:表示请求消息正文的长度。
Connection:表示是否需要持久连接。
4.响应消息头
Location:通知客户端,指示新的资源的位置(结合302/307来用。请求重定向)
eg:
package cn.lsl.http.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setStatus(302); //设置响应码 response.setHeader("Location", "/Http/index.jsp"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } }
Server:通知客户端,服务器的类型
Content-Encoding:通知客户端,响应正文的压缩编码方式。常用的gzip。
package cn.lsl.http.servlet; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.zip.GZIPOutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletDemo2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; byte b[] = data.getBytes(); System.out.println("原始数据的大小:"+b.length); //GZIP压缩 //带有缓存的字节内存输出流 ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gout = new GZIPOutputStream(out); gout.write(b); gout.close(); b = out.toByteArray(); System.out.println("压缩后的数据大小:"+b.length); response.setHeader("Content-Encoding", "gzip");//通知客户端数据的压缩编码 response.setHeader("Content-Length", b.length+""); response.getOutputStream().write(b);//输出相应正文 } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } }
Content-Length:通知客户端响应正文的数据大小。
Content-Type:通知客户端响应正文的MIME类型
Refresh:让浏览器自动刷新。取值为正数(刷新的时间间隔,单位是秒)
Refresh:3
Refresh:3;URL=其他资源的URI
eg:
package cn.lsl.http.servlet; import java.io.IOException; import java.util.Random; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletDemo3 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Random r = new Random(); String data = r.nextInt()+""; //response.setHeader("Refresh", "1");//间隔1秒刷新到自己 response.setHeader("Refresh", "3;URL=/Http/index.jsp");//3秒后刷新到其他资源 response.getOutputStream().write(data.getBytes()); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } }
Content-Disposition:通知客户端,以下载的方式打开资源。
package cn.lsl.http.servlet; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletDemo4 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String filePath = getServletContext().getRealPath("/1.jpg"); //通知客户端以下载的方式打开 response.setHeader("Content-Disposition", "attachment;filename=1.jpg"); response.setHeader("Content-Type", "application/octet-stream"); InputStream in = new FileInputStream(filePath); OutputStream out = response.getOutputStream(); int len = -1; byte b[] = new byte[1024]; while((len=in.read(b))!=-1){ out.write(b, 0, len); } in.close(); out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } }
以下三个一起用,通知客户端不要缓存
Expires:-1 网页的有效时间。单位是毫秒
Cache-Control:no-cache
Pragma:no-cache
eg:
package cn.lsl.http.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletDemo5 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String data = "aaaaaaaaaaaaaaaaaaa"; response.setHeader("Expires", "-1"); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.getOutputStream().write(data.getBytes()); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } }