HTTP協議簡介html
1.WEB瀏覽器與WEB服務器之間的一問一答的交互過程必須遵循必定的規則,這個規則就是HTTP協議。java
2.HTTP是HyperText Transfer Protocol(超文本傳輸協議)的簡寫,它是TCP/IP協議的一個應用層協議,用於描述客戶端與服務器間的數據傳遞。瀏覽器
3.HTTP的版本有1.0和1.1緩存
1.0的特色:每次請求服務器上的資源都要創建新的鏈接,響應完畢後會關閉鏈接,是無狀態的協議。安全
1.1的特色:在一次TCP/IP鏈接的基礎上能夠發出屢次請求和獲得屢次的響應。比1.0多了一些請求和響應頭。服務器
HTTP協議的組成部分app
1.請求部分dom
GET /App1/1.html HTTP/1.1jsp
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); } }