1. Get ใช้เพื่อรับข้อมูลจากเซิร์ฟเวอร์ในขณะที่โพสต์ใช้เพื่อส่งข้อมูลไปยังเซิร์ฟเวอร์
2. รับข้อมูลในแบบฟอร์มไปยัง URL ที่ชี้ไปที่การกระทำในรูปแบบของตัวแปร = ค่าและใช้ A? การเชื่อมต่อระหว่างทั้งสองในขณะที่ & การเชื่อมต่อระหว่างตัวแปรแต่ละตัว; การโพสต์คือการวางข้อมูลในรูปแบบในตัวข้อมูลและส่งผ่านไปยัง URL ที่ชี้ไปที่การกระทำในวิธีที่ตัวแปรและค่าสอดคล้องกับค่า
3. Get ไม่ปลอดภัยเพราะในระหว่างกระบวนการส่งข้อมูลจะถูกวางไว้ใน URL ที่ร้องขอ ทุกวันนี้เซิร์ฟเวอร์ที่มีอยู่จำนวนมากเซิร์ฟเวอร์พร็อกซีหรือตัวแทนผู้ใช้จะบันทึก URL ที่ร้องขอลงในไฟล์บันทึกแล้ววางไว้ที่ไหนสักแห่งเพื่อให้ข้อมูลความเป็นส่วนตัวบางอย่างอาจเห็นได้จากบุคคลที่สาม นอกจากนี้ผู้ใช้ยังสามารถเห็นข้อมูลที่ส่งไปยังเบราว์เซอร์โดยตรงและข้อความระบบภายในบางข้อความจะปรากฏต่อหน้าผู้ใช้ การดำเนินการทั้งหมดของโพสต์นั้นมองไม่เห็นผู้ใช้
4. ปริมาณข้อมูลที่ส่งโดย GET มีขนาดเล็กซึ่งส่วนใหญ่เกิดจากข้อ จำกัด ของความยาว URL; และโพสต์สามารถถ่ายโอนข้อมูลจำนวนมากดังนั้นคุณสามารถใช้โพสต์เมื่ออัปโหลดไฟล์ (แน่นอนมีเหตุผลอื่นซึ่งจะกล่าวถึงในภายหลัง)
5. รับการ จำกัด ค่าของชุดข้อมูลของแบบฟอร์มที่จะเป็นอักขระ ASCII; ในขณะที่โพสต์รองรับชุดอักขระ ISO10646 ทั้งหมด โดยค่าเริ่มต้นการเข้ารหัส ISO-8859-1
6. รับเป็นวิธีการเริ่มต้นของแบบฟอร์ม
การเปรียบเทียบต่อไปนี้มีประโยชน์มาก:
ฉันทำงานเกี่ยวกับการพัฒนาเว็บ Java มาระยะหนึ่งแล้วและมีปัญหาที่ทำให้ฉันรำคาญใจอยู่เสมอซึ่งเป็นปัญหาของการอ่านหนังสือ โดยพื้นฐานแล้วฉันค้นหาวิธีแก้ปัญหาออนไลน์ (มีข้อมูลออนไลน์มากมาย) และพวกเขาทั้งหมดแนะนำวิธีแก้ปัญหาที่อ่านไม่ออก แต่มีเพียงไม่กี่คนที่อธิบายเรื่องราวทั้งหมดของปัญหาอย่างชัดเจน บางครั้งหลังจากอ่านบทความบางเรื่องฉันคิดว่าฉันเข้าใจ แต่ในการพัฒนาปัญหาที่อ่านไม่ออกก็ออกมาเหมือนผีและเป็นเรื่องใหญ่จริงๆ! บทความนี้เป็นการสะสมความเข้าใจในการต่อสู้ระยะยาวของฉันกับรหัสที่อ่านไม่ออกและฉันหวังว่าเพื่อนจะให้คำแนะนำและอาหารเสริมมากขึ้น
มี 2 วิธีสำหรับแบบฟอร์มในการส่งข้อมูลไปยังเซิร์ฟเวอร์ให้พูดคุยเกี่ยวกับ Get และ Post ตามลำดับ
(i) รับการส่ง
1. ก่อนอื่นมาพูดคุยเกี่ยวกับวิธีการเข้ารหัสข้อมูลและส่งไปยังเซิร์ฟเวอร์โดยใช้วิธี GET
สำหรับวิธีการรับข้อมูลจะถูกต่อกันหลังจาก URL ที่ร้องขอเป็นพารามิเตอร์เช่น: http: // localhost: 8080/servlet? msg = abc
(ปัญหาที่พบบ่อยมากของรหัสที่อ่านไม่ออกจะปรากฏขึ้นหากอักขระภาษาจีนหรืออักขระพิเศษอื่น ๆ ปรากฏใน URL เช่น: http: // localhost: 8080/servlet? msg = hangzhou, รหัสที่อ่านไม่ออกเป็นเรื่องง่าย กระบวนการเข้ารหัส URL คือการเข้ารหัสส่วนหนึ่งของ URL เป็นอักขระและเข้ารหัสลงในรหัสไบนารีไบต์ตามวิธีการเข้ารหัสที่แน่นอน (เช่น: UTF-8, GBK ฯลฯ ) จากนั้นแต่ละไบต์จะแสดงด้วยสตริง %XY ที่มี 3 อักขระ สิ่งที่ฉันพูดที่นี่อาจไม่ชัดเจน สำหรับรายละเอียดโปรดดูการแนะนำคลาส java.net.urlencoder ที่นี่ หลังจากทำความเข้าใจกับกระบวนการเข้ารหัส URL เราสามารถเห็นคำถามที่สำคัญสองข้อ ครั้งแรก: อักขระที่ต้องใช้ URL encode โดยทั่วไปจะไม่ใช่อักขระที่ไม่ใช่ ASCII (โดยทั่วไปพูด) กล่าวง่ายๆยกเว้นจดหมายภาษาอังกฤษ (เช่นจีนญี่ปุ่น ฯลฯ ) ทุกคนต้องทำการเข้ารหัส URL ดังนั้นสำหรับเราแล้ว URL ENCODE จะไม่อ่านหนังสือเมื่อเซิร์ฟเวอร์ได้รับรหัสที่อ่านไม่ออก รหัสที่อ่านไม่ออกเกิดจาก URL ที่มีอักขระจีนหรืออักขระพิเศษใน URL ประการที่สอง: URL เข้ารหัสอักขระที่เข้ารหัสแบบใด นี่คือธุรกิจของเบราว์เซอร์และเบราว์เซอร์ที่แตกต่างกันมีแนวทางปฏิบัติที่แตกต่างกัน เบราว์เซอร์เวอร์ชันจีนมักใช้ GBK โดยค่าเริ่มต้น UTF-8 ยังสามารถใช้งานได้โดยการตั้งค่าเบราว์เซอร์ ผู้ใช้ที่แตกต่างกันอาจมีการตั้งค่าเบราว์เซอร์ที่แตกต่างกันซึ่งนำไปสู่วิธีการเข้ารหัสที่แตกต่างกัน ดังนั้นเว็บไซต์หลายแห่งทำการเข้ารหัส URL ก่อนโดยใช้ JavaScript สำหรับอักขระจีนหรืออักขระพิเศษใน URL จากนั้นทำการต่อ URL เพื่อส่งข้อมูลนั่นคือการเข้ารหัส URL สำหรับเบราว์เซอร์ ข้อได้เปรียบคือเว็บไซต์สามารถรวมวิธีการเข้ารหัสของการส่งข้อมูล หลังจากเสร็จสิ้นการเข้ารหัส URL URL ปัจจุบันจะกลายเป็นตัวละครภายในช่วง ASCII แล้วแปลงเป็นไบนารีในวิธีการเข้ารหัสของ ISO-8859-1 และถูกส่งออกไปพร้อมกับส่วนหัวคำขอ ฉันอยากจะพูดอีกเล็กน้อยที่นี่ว่าสำหรับวิธีการรับไม่มีเอนทิตีคำขอและ URL ที่มีข้อมูลอยู่ในส่วนหัวคำขอทั้งหมด เหตุผลที่ฉันใช้ URL encode คือ: สำหรับส่วนหัวคำขอข้อมูลบริสุทธิ์ของส่วนหัวคำขอจะต้องถูกเข้ารหัสเป็นไบนารี 101010 ... ในท้ายที่สุดข้อมูลบริสุทธิ์ของส่วนหัวคำขอจะต้องส่งบนอินเทอร์เน็ต หากคุณเข้ารหัสอักขระพิเศษโดยตรงเช่นอักขระจีนและตัวละครอื่น ๆ ISO-8859-1 ข้อมูลจะหายไปดังนั้นจึงจำเป็นต้องทำการเข้ารหัส URL ก่อน
2. ฝั่งเซิร์ฟเวอร์ (TOMCAT) รับข้อมูลสำหรับการถอดรหัสอย่างไร
ขั้นตอนแรกคือการถอดรหัสข้อมูลด้วย ISO-8859-1 สำหรับวิธีการรับ Tomcat จะได้รับอักขระส่วนหัวข้อมูลในช่วง ASCII และ URL คำขอมีข้อมูลพารามิเตอร์ หากมีอักขระพิเศษเช่นภาษาจีนในพารามิเตอร์แสดงว่ายังคงเป็นสถานะ %XY หลังจากเข้ารหัส URL หยุดก่อนที่จะพูดคุยเกี่ยวกับกระบวนการทั่วไปของการรับข้อมูลโดยนักพัฒนา โดยปกติทุกคนจะได้รับข้อมูลพารามิเตอร์ วัตถุคำขอหรือข้อมูลที่เราได้รับคือการถอดรหัส แต่โปรแกรมไม่สามารถระบุได้ในระหว่างกระบวนการถอดรหัส ที่นี่เราต้องบอกว่ามือใหม่หลายคนบอกว่าการใช้ คำขอ setcharacterencoding (ชุดอักขระ) สามารถระบุวิธีการถอดรหัสได้ แต่จริงๆแล้วมันเป็นไปไม่ได้ เมื่อดูที่ API อย่างเป็นทางการของ Servlet มีคำอธิบายสำหรับวิธีนี้: แทนที่ชื่อของการเข้ารหัสอักขระที่ใช้ในร่างกายของคำขอนี้ วิธีนี้จะต้องเรียกก่อนการอ่านพารามิเตอร์คำขอหรือการอ่านอินพุตโดยใช้ getReader () จะเห็นได้ว่าเขาไม่มีอำนาจที่จะทำอะไรเกี่ยวกับวิธีการรับ ดังนั้นวิธีการเข้ารหัสแบบใดที่ใช้ในการถอดรหัสข้อมูล นี่คือธุรกิจของ Tomcat ค่าเริ่มต้นเริ่มต้นคือ ISO-8859-1 ดังนั้นเราจึงสามารถค้นหาได้ว่าทำไมคำขอ GET จึงมีพารามิเตอร์ภาษาจีนและทำไมรหัสที่อ่านไม่ออกทางฝั่งเซิร์ฟเวอร์ เหตุผลก็คือ UTF-8 หรือ GBK มักจะใช้เพื่อเข้ารหัส URL Data ที่นี่ตัวถอดรหัส URL นั้นเป็นไปไม่ได้ ในโปรแกรมเราสามารถโดยตรง
รหัส Java
1. สตริงใหม่ (request.getParameter (ชื่อ) .getBytes (ISO-8859-1) วิธีการเข้ารหัส URL เข้ารหัสที่ระบุโดยไคลเอนต์)
กู้คืนกลับไปที่ bytecode และถอดรหัสข้อมูลในวิธีที่ถูกต้อง บทความออนไลน์มักจะกำหนดค่าใน Tomcat
รหัส XML
1. <พอร์ตตัวเชื่อมต่อ = 8080 โปรโตคอล = HTTP/1.1 MaxThreads = 150 ConnectionTimeout = 20000 RedirectPort = 8443 URIENCODING = GBK/>
สิ่งนี้ช่วยให้ Tomcat สามารถใช้วิธีการที่ระบุเพื่อดึงข้อมูล การแนะนำตัวถอดรหัส URL อยู่ที่นี่
(i) การส่งโพสต์
1. วิธีเข้ารหัสข้อมูลและส่งไปยังเซิร์ฟเวอร์โดยใช้วิธีการโพสต์ของไคลเอนต์ (เบราว์เซอร์)
ข้อมูลที่จะส่งในวิธีการโพสต์จะต้องมีการเข้ารหัส URL ดังนั้นจึงใช้วิธีการเข้ารหัสแบบใด
หากมีเซ็กเมนต์ <meta http-equiv = เนื้อหาประเภทเนื้อหา = text/html; CHARSET = ชุดอักขระ (GBK, UTF-8 ฯลฯ ) ในไฟล์ HTML ที่ตั้งค่าฟอร์มจากนั้นโพสต์จะถูกเข้ารหัสในวิธีการเข้ารหัสที่ระบุไว้ที่นี่ โดยทั่วไปทุกคนคิดว่ารหัสนี้คือการแจ้งให้เบราว์เซอร์ทราบว่าอักขระใดที่ตั้งค่าไว้เพื่อตีความหน้าเว็บดังนั้นเว็บไซต์จะวางไว้ที่ส่วนหน้าของรหัส HTML และพยายามที่จะไม่ปรากฏรหัสที่อ่านไม่ออก ในความเป็นจริงมันยังมีฟังก์ชั่นอื่นเพื่อ ระบุวิธีการเข้ารหัส URL เข้ารหัสของวิธีการโพสต์ของแบบฟอร์มเพื่อส่งข้อมูล จากที่นี่เราจะเห็นได้ว่าสำหรับวิธี GET to Count วิธีการเข้ารหัส URL ของเบราว์เซอร์จะถูกกำหนดโดยการตั้งค่าเบราว์เซอร์ (สามารถระบุได้ใน JS สำหรับข้อมูลจำเพาะแบบครบวงจร) และวิธีการโพสต์สามารถระบุได้โดยนักพัฒนา
2. ฝั่งเซิร์ฟเวอร์ (TOMCAT) รับข้อมูลสำหรับการถอดรหัสอย่างไร
หากคุณใช้การตั้งค่าเริ่มต้นของ Tomcat และไม่มีการตั้งค่าการเข้ารหัสเช่นตัวกรองจะถูกถอดรหัสด้วย ISO-8859-1 แต่คำขอ Setcharacterencoding (ชุดอักขระ) สามารถมีประโยชน์ได้
ฉันพบว่าหลักฐานของสิ่งที่ Tomcat ทำข้างต้นคือไม่มีวิธีการเข้ารหัสที่ระบุไว้ในส่วนหัวคำขอ หากวิธีการเข้ารหัสที่ระบุไว้ในส่วนหัวคำขอจะถูกเข้ารหัสด้วยวิธีนี้มี 2 บทความแนะนำและที่อยู่คือ
การเข้ารหัส URL เชิงลึกและง่ายต่อการเข้าใจ: http://www.cnblogs.com/yencain/articles/1321386.html;
ปัญหารหัสขยะเมื่อส่งข้อมูลโดยใช้วิธีการโพสต์: http://wanghuan8086.javaeye.com/blog/173869
มันเป็นสิ่งสำคัญที่จะใช้โพสต์ หากมีเซ็กเมนต์ในไฟล์ HTML ที่ตั้งอยู่ <meta http-equiv = เนื้อหาประเภทเนื้อหา = text/html; charset = ชุดอักขระ (gbk, utf-8, ฯลฯ )/>>
ขอแนะนำให้ส่งโพสต์