1. โปรโตคอล HTTP คืออะไร
HTTP เป็นตัวย่อของโปรโตคอลการถ่ายโอนไฮเปอร์เท็กซ์ มันเป็นโปรโตคอลแอปพลิเคชันชั้นของโปรโตคอล TCP/IP ซึ่งใช้เพื่อกำหนดกระบวนการแลกเปลี่ยนข้อมูลระหว่างเว็บเบราว์เซอร์และเว็บเซิร์ฟเวอร์ หลังจากที่ไคลเอนต์เชื่อมต่อกับเว็บเซิร์ฟเวอร์หากคุณต้องการรับทรัพยากรเว็บในเว็บเซิร์ฟเวอร์คุณต้องปฏิบัติตามรูปแบบการสื่อสารที่แน่นอน โปรโตคอล HTTP ใช้เพื่อกำหนดรูปแบบสำหรับไคลเอนต์เพื่อสื่อสารกับเว็บเซิร์ฟเวอร์
2. รุ่นโปรโตคอล HTTP
รุ่นโปรโตคอล HTTP: HTTP/1.0, http/1.1
3. ความแตกต่างระหว่าง http1.0 และ http1.1
ในโปรโตคอล HTTP 1.0 หลังจากไคลเอนต์สร้างการเชื่อมต่อกับเว็บเซิร์ฟเวอร์สามารถรับทรัพยากรเว็บได้เพียงหนึ่งเดียวเท่านั้น
ในโปรโตคอล HTTP 1.1 หลังจากไคลเอนต์สร้างการเชื่อมต่อกับเว็บเซิร์ฟเวอร์ทรัพยากรเว็บหลายแหล่งจะได้รับจากการเชื่อมต่อเดียว
4. คำขอ http
4.1. เนื้อหาที่รวมอยู่ในคำขอ HTTP
หลังจากไคลเอนต์เชื่อมต่อกับเซิร์ฟเวอร์จะร้องขอทรัพยากรเว็บบางอย่างจากเซิร์ฟเวอร์ซึ่งเรียกว่าไคลเอนต์ที่ส่งคำขอ HTTP ไปยังเซิร์ฟเวอร์
คำขอ HTTP ที่สมบูรณ์รวมถึงเนื้อหาต่อไปนี้: บรรทัดคำขอส่วนหัวข้อความหลายรายการและตัวอย่างของเนื้อหาเอนทิตี:
4.2. รายละเอียดของคำขอ HTTP - สายคำขอ
รับในสายคำขอเรียกว่าวิธีการร้องขอ วิธีการร้องขอรวมถึง: โพสต์, รับ, หัว, ตัวเลือก, ลบ, การติดตาม, การวางและวิธีที่ใช้กันทั่วไป ได้แก่ : รับ, โพสต์
หากผู้ใช้ไม่มีการตั้งค่าโดยค่าเริ่มต้นเบราว์เซอร์จะส่งคำขอรับไปยังเซิร์ฟเวอร์ ตัวอย่างเช่นการเข้าถึงจะถูกป้อนโดยตรงในเบราว์เซอร์การเข้าถึงจะถูกคลิกที่ไฮเปอร์ลิงก์ ฯลฯ ฯลฯ ได้รับทั้งหมด หากผู้ใช้ต้องการเปลี่ยนวิธีการขอให้โพสต์เขาสามารถเปลี่ยนวิธีการส่งแบบฟอร์ม
ไม่ว่าจะเป็นโพสต์หรือรับเพื่อขอทรัพยากรเว็บจากเซิร์ฟเวอร์ ความแตกต่างระหว่างสองวิธีนี้ส่วนใหญ่สะท้อนให้เห็นในการส่งข้อมูล: หากวิธีการร้องขอได้รับข้อมูลที่ส่งไปยังเซิร์ฟเวอร์สามารถนำมาในรูปแบบของ A ได้หรือไม่? หลังจากที่อยู่ URL ที่ร้องขอและข้อมูลหลายข้อมูลจะถูกคั่นด้วย & ตัวอย่างเช่น: get /mail/1.html?name=abc&password=xyz http/1.1
คุณสมบัติของวิธีการรับ: พารามิเตอร์ที่แนบมากับที่อยู่ URL มี จำกัด และความสามารถของข้อมูลมักจะไม่เกิน 1K
หากวิธีการร้องขอคือการโพสต์ข้อมูลสามารถส่งไปยังเซิร์ฟเวอร์ในเนื้อหาเอนทิตีที่ร้องขอ ลักษณะของวิธีการโพสต์คือ: ปริมาณของข้อมูลที่ส่งไม่ จำกัด
4.3. รายละเอียดของคำขอ HTTP - ส่วนหัวข้อความ
ส่วนหัวข้อความทั่วไปในคำขอ HTTP
ยอมรับ: เบราว์เซอร์บอกเซิร์ฟเวอร์ผ่านส่วนหัวนี้และประเภทข้อมูลที่รองรับ Accept-Charset: เบราว์เซอร์บอกเซิร์ฟเวอร์ผ่านส่วนหัวนี้ซึ่งตัวละครตั้งไว้รองรับ ยอมรับการเข้ารหัส: เบราว์เซอร์บอกเซิร์ฟเวอร์ผ่านส่วนหัวนี้และรูปแบบการบีบอัดที่รองรับยอมรับภาษา: เบราว์เซอร์จะบอกเซิร์ฟเวอร์ผ่านส่วนหัวนี้และโฮสต์สถานที่: เบราว์เซอร์บอกเซิร์ฟเวอร์ผ่านส่วนหัวนี้และโฮสต์ที่จะเข้าถึง if-modified-sness: เบราว์เซอร์บอกเซิร์ฟเวอร์ผ่านส่วนหัวนี้และเวลาในการแคชข้อมูล ผู้อ้างอิง: เบราว์เซอร์บอกเซิร์ฟเวอร์ผ่านส่วนหัวนี้และหน้าไคลเอ็นต์ใดมาจาก การเชื่อมต่อ: เบราว์เซอร์บอกเซิร์ฟเวอร์ผ่านส่วนหัวนี้และจะยกเลิกการเชื่อมต่อลิงค์หรือลิงค์หลังจากคำขอเสร็จสมบูรณ์
ตัวอย่างเช่น:
ยอมรับ: แอปพลิเคชัน/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, */ *
ผู้อ้างอิง: http: // localhost: 8080/javawebdemoproject/web/2.jsp
ยอมรับภาษา: zh-cn
ผู้ใช้ตัวแทน: Mozilla/4.0 (เข้ากันได้; MSIE 8.0; Windows NT 6.1; wow64; Trident/4.0; SLCC2; .net Clr 2.0.50727; .net CLR 3.5.30729;
ยอมรับการเข้ารหัส: gzip, deflate
โฮสต์: LocalHost: 8080
การเชื่อมต่อ: Keep-Alive
5. การตอบสนอง 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 พฤษภาคม 2014 16:23:28 GMT <html> </body> </html>
5.2. รายละเอียดของการตอบกลับ http - บรรทัดสถานะ
รูปแบบบรรทัดสถานะ: HTTP เวอร์ชันหมายเลขรหัสสถานะคำสั่งเหตุผลคำสั่ง <crlf>
ตัวอย่าง: http/1.1 200 ตกลง
รหัสสถานะใช้เพื่อแสดงผลการประมวลผลของเซิร์ฟเวอร์ของคำขอ มันเป็นเลขทศนิยมสามหลัก รหัสสถานะการตอบสนองแบ่งออกเป็น 5 หมวดหมู่ดังที่แสดงด้านล่าง:
5.3. รายละเอียดการตอบกลับ http - ส่วนหัวการตอบกลับที่ใช้กันทั่วไป
ส่วนหัวการตอบกลับทั่วไป (ส่วนหัวข้อความ) ในการตอบสนอง HTTP
สถานที่: เซิร์ฟเวอร์ใช้ส่วนหัวนี้เพื่อบอกเบราว์เซอร์ว่าจะข้ามไปยังเซิร์ฟเวอร์ได้ที่ไหน: เซิร์ฟเวอร์ใช้ส่วนหัวนี้เพื่อบอกเบราว์เซอร์โมเดลของการเข้ารหัสเนื้อหาเซิร์ฟเวอร์: เซิร์ฟเวอร์ใช้ส่วนหัวนี้เพื่อบอกเบราว์เซอร์รูปแบบการบีบอัดของความยาว เซิร์ฟเวอร์ใช้ส่วนหัวนี้เพื่อบอกเบราว์เซอร์ว่าประเภทของข้อมูลที่จะส่งคืนการรีเฟรช: เซิร์ฟเวอร์ใช้ส่วนหัวนี้เพื่อบอกเบราว์เซอร์ให้รีเฟรชเนื้อหา: เซิร์ฟเวอร์ใช้ส่วนหัวนี้เพื่อบอกเบราว์เซอร์ให้เขียนข้อมูลในการถ่ายโอนข้อมูลการใช้งาน ไม่มีแคช
Pragma: ไม่มีแคช
6. ตั้งส่วนหัวการตอบกลับบนเซิร์ฟเวอร์เพื่อควบคุมพฤติกรรมของเบราว์เซอร์ไคลเอนต์
6.1. ตั้งส่วนหัวการตอบกลับตำแหน่งเพื่อรับรู้การเปลี่ยนเส้นทางคำขอ
แพ็คเกจ gacl.http.study; นำเข้า java.io.ioexception; นำเข้า Javax.servlet.servletexception; นำเข้า Javax.servlet.http.httpservlet; นำเข้า javax.servlet.http.httpservletRequest; GACL * */คลาสสาธารณะ ServletDemo01 ขยาย httpservlet {โมฆะสาธารณะ doget (httpservletrequest คำขอ, httpservletResponse การตอบสนอง) พ่น servletexception, ioexception {response.setstatus (302); // ตั้งค่าสถานะการตอบสนองของเซิร์ฟเวอร์ นี่คือการเปลี่ยนเส้นทางคำขอ*/response.Setheader ("ตำแหน่ง", "/Javaweb_httpprotocol_study_20140528/1.jsp"); } โมฆะสาธารณะ dopost (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {this.doget (คำขอ, การตอบสนอง); -เมื่อคุณใช้ที่อยู่ URL "http: // localhost: 8080/javaweb_httpprotocol_study_20140528/servlet/servletdemo01" เพื่อเข้าถึง servletdemo01
เซิร์ฟเวอร์ส่งคืนรหัสสถานะ 302 เพื่อบอกเบราว์เซอร์ว่าฉันไม่มีทรัพยากรที่คุณต้องการ แต่ฉันบอกคุณว่ามันอยู่ที่ไหนผ่านส่วนหัวการตอบกลับตำแหน่ง หลังจากเบราว์เซอร์วิเคราะห์ส่วนหัวการตอบกลับมันรู้ว่ามันต้องการข้ามไปที่ /javaweb_httpprotocol_study_20140528/1.jsp หน้าดังนั้นมันจะข้ามไปที่ 1.JSP โดยอัตโนมัติดังแสดงในรูปด้านล่าง:
6.2. ตั้งค่าส่วนหัวการตอบสนองการเข้ารหัสเนื้อหาเพื่อแจ้งให้เบราว์เซอร์ทราบถึงรูปแบบการบีบอัดของข้อมูล
แพ็คเกจ gacl.http.study; นำเข้า java.io.byTearrayOutputStream; นำเข้า java.io.ioException; นำเข้า java.util.zip.gzipoutputstream; นำเข้า Javax.servlet.servletexception; javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletResponse****@author gacl* ใช้สตรีม gzipoutputstream เพื่อบีบอัดข้อมูล*2 ตั้งค่าการเข้ารหัสเนื้อหาส่วนหัวของการตอบสนองเพื่อบอกเบราว์เซอร์ว่ารูปแบบการบีบอัดของข้อมูลที่ส่งกลับโดยเซิร์ฟเวอร์*/คลาสสาธารณะ ServletDemo02 ขยาย HTTPSERVLET {โมฆะสาธารณะ DOGET (HTTPSERVLETREQUEST "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcda bcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabc dabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcda bcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd "cdabcdabcdabcdabcdabcdabcdabcdabc" + "dabcdabcdabcdabcdabcdabcdabcdabc" + "dabcdabcdabcdabcdabcdabcdabcdabcdab" + "cdabcdabcdabcdabcdabcdabcdabcdabcdab" + "cdabcdabcdabcdabcdabcdabcdabcdabcdab" + "cdabcdabcdabcdabcdabcdabcdabcdabcdab" + "cdabcdabcdabcdabcdabcdabcdabcdabcdabcd"; System.out.println ("原始数据的大小为:" + data.getBytes (). ความยาว); ByTeArrayOutputStream Bout = New ByteArrayOutputStream (); gzipoutputStream gout = ใหม่ gzipoutputstream (การแข่งขัน); // buffer gout.write (data.getBytes ()); Gout.close (); // รับข้อมูลบีบอัดไบต์ g [] = bout.tobytearray (); Response.Setheader ("การเข้ารหัสเนื้อหา", "GZIP"); Response.Setheader ("ความยาวเนื้อหา", G.Length +""); Response.getOutputStream (). เขียน (g); } โมฆะสาธารณะ dopost (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {this.doget (คำขอ, การตอบสนอง); -ข้อมูลการตอบกลับที่ส่งโดยเซิร์ฟเวอร์ไปยังเบราว์เซอร์มีดังนี้:
รูปแบบการบีบอัดที่รองรับโดยเบราว์เซอร์คือ:
6.3. ตั้งส่วนหัวการตอบกลับประเภทเนื้อหาและระบุประเภทข้อมูล loopback
แพ็คเกจ gacl.http.study; นำเข้า java.io.ioexception; นำเข้า java.io.inputstream; นำเข้า java.io.outputstream; นำเข้า Javax.servlet.servletexception; นำเข้า Javax.servlet.http.httpsert; javax.servlet.http.httpservletRequest; นำเข้า Javax.servlet.http.httpservletResponse; ระดับสาธารณะ servletdemo03 ขยาย httpservlet {void public (httpservletrequest Request เบราว์เซอร์สามารถรับ (ยอมรับ) คือ: แอปพลิเคชัน/X-MS-Application, * image/jpeg, * application/xaml+xml, * image/gif, * image/pjpeg, * application/x-ms-xbap, * application/vnd.ms-excel, * application/vnd.ms-powerpoint "image/jpeg"); // ใช้ส่วนหัวการตอบกลับประเภทเนื้อหาเพื่อระบุชนิดข้อมูลที่ส่งไปยังเบราว์เซอร์เป็น "image/jpeg" // อ่านภาพ wp_20131005_002.jpg ในโฟลเดอร์ IMG ที่อยู่ในรูทไดเรกทอรีของโครงการ this.getServletContext (). getResourceasstream ("/img/wp_20131005_002.jpg"); บัฟเฟอร์ไบต์ [] = ไบต์ใหม่ [1024]; int len = 0; OutputStream out = response.getOutputStream (); // รับกระแสเอาต์พุตในขณะที่ ((len = in.read (บัฟเฟอร์))> 0) {// อ่านเนื้อหาในสตรีมอินพุต (ใน) และเก็บไว้ในบัฟเฟอร์ (บัฟเฟอร์) out.write (บัฟเฟอร์, 0, len); httpservletResponse response) พ่น servletexception, ioexception {this.doget (คำขอ, การตอบสนอง); -ข้อมูลการตอบกลับที่ส่งโดยเซิร์ฟเวอร์ไปยังเบราว์เซอร์มีดังนี้:
ผลการทำงานของ ServletDemo03 จะแสดงในรูปด้านล่าง:
รูปภาพจะปรากฏในเบราว์เซอร์
6.4. ตั้งส่วนหัวการตอบสนองการรีเฟรชเพื่อรีเฟรชเบราว์เซอร์เป็นประจำ
แพ็คเกจ gacl.http.study; นำเข้า java.io.ioexception; นำเข้า Javax.servlet.servletexception; นำเข้า Javax.servlet.http.httpservlet; นำเข้า Javax.servlet.http.httpservletRequest; ServletDemo04 ขยาย httpservlet {public void doget (httpservletrequest Request, httpservletResponse การตอบสนอง) โยน servletexception, ioexception { / ** * ตั้งส่วนหัวการตอบสนองการรีเฟรชเพื่อให้เบราว์เซอร์รีเฟรชเป็นประจำทุก 3 วินาที /** * ตั้งส่วนหัวการตอบสนองการรีเฟรชเพื่อให้เบราว์เซอร์กระโดดไปที่ http://www.baidu.com ใน 3 วินาที */response.setheader ("Refresh", "3; url = 'http: //www.baidu.com'); Response.getWriter (). เขียน ("GACL"); } โมฆะสาธารณะ dopost (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {this.doget (คำขอ, การตอบสนอง); - 6.5. ตั้งค่าส่วนหัวการตอบสนองต่อเนื้อหาเพื่อให้เบราว์เซอร์ดาวน์โหลดไฟล์
แพ็คเกจ gacl.http.study; นำเข้า java.io.ioexception; นำเข้า java.io.inputstream; นำเข้า java.io.outputstream; นำเข้า Javax.servlet.servletexception; นำเข้า Javax.servlet.http.httpsert; javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletResponse; คลาสสาธารณะ servletdemo05 ขยาย httpservlet {โมฆะสาธารณะ doget ส่วนหัวการตอบกลับเพื่อให้เบราว์เซอร์ดาวน์โหลดไฟล์ */ response.setheader ("เนื้อหา-การจัดสรร", "ไฟล์แนบ; ชื่อไฟล์ = xxx.jpg"); inputStream ใน = this.getServletContext (). getResourceasstream ("/img/1.jpg"); บัฟเฟอร์ไบต์ [] = ไบต์ใหม่ [1024]; int len = 0; outputStream out = response.getOutputStream (); ในขณะที่ ((len = in.read (บัฟเฟอร์))> 0) {out.write (บัฟเฟอร์, 0, len); }} โมฆะสาธารณะ dopost (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {this.doget (คำขอ, การตอบสนอง); -เมื่อเข้าถึง ServletDemo05 ในเบราว์เซอร์กล่องดาวน์โหลดไฟล์จะปรากฏขึ้นดังแสดงในรูปต่อไปนี้:
ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์กับการเรียนรู้ของทุกคน