ฉันไม่ต้องการใช้เซสชันเมื่อเร็ว ๆ นี้ ฉันต้องการสัมผัสกับโทเค็นวิธีที่ปลอดภัยและมีเสถียรภาพมากขึ้นและเขียนอินเทอร์เฟซแบบครบวงจรสำหรับเบราว์เซอร์และแอพ ดังนั้นฉันจึงเปลี่ยนแผนกต้อนรับของโปรแกรมการฝึกอบรมเป็นอาแจ็กซ์จากนั้นกระโดดและใช้ SpringMVC เพื่อควบคุมการส่งต่อ ฉันมีความเข้าใจที่ลึกซึ้งยิ่งขึ้นเกี่ยวกับการส่งข้อมูล JSON ฉันจะแบ่งปันและโปรดแก้ไขฉัน
ใน SpringMVC เราสามารถเลือกได้หลายวิธีในการยอมรับ JSON ก่อนที่จะพูดถึงวิธีที่ SpringMVC ยอมรับ JSON ลองพูดคุยกันว่า JSON คืออะไร ฉันจะไม่อธิบายรายละเอียดเกี่ยวกับคำจำกัดความที่เฉพาะเจาะจง ใน JavaScript เรามักจะกำหนดวัตถุ JSON ด้วยวิธีนี้
var jsonObject = {"ชื่อผู้ใช้": "ผู้ดูแลระบบ", "รหัสผ่าน": 123}ในรูปแบบนี้เราเรียกมันว่าวัตถุ JSON และยังมีแนวคิดที่เรียกว่า JSON String ตามชื่อแนะนำว่าทั้งหมดถูกห่อหุ้มด้วย '' หรือ "" เราเรียกมันว่าสตริง เรารู้ว่าสตริงสามารถส่งออกได้โดยตรง แต่วัตถุไม่สามารถส่งออกได้โดยตรง ดังนั้นใน JavaScript เราทำได้
// กำหนดวัตถุ JsonObjectVar jsonObject = {"ชื่อผู้ใช้": "ผู้ดูแลระบบ", "รหัสผ่าน": 123}; แจ้งเตือน (jsonObject);ในเวลานี้ [Object Object] จะปรากฏขึ้นโดยไม่ส่งออกเนื้อหาของวัตถุ JSON JavaScript ให้เครื่องมือสองอย่างแก่เรา
json.parse () ใช้เพื่อแปลงสตริง JSON เป็นวัตถุ JavaScript json.stringify () ใช้เพื่อแปลงค่า JavaScript เป็นสตริง JSON
ดังนั้นเมื่อเราพิมพ์
การแจ้งเตือน (json.stringify (jsonobject));
{"ชื่อผู้ใช้": "ผู้ดูแลระบบ", "รหัสผ่าน": 123} จะปรากฏขึ้น;
* โอเคนั่นคือทั้งหมดสำหรับคำอธิบายของ JSON พูดคุยเกี่ยวกับ SpringMvc *
เนื่องจาก JSON มีวิธีการดำรงอยู่สองวิธีข้างต้นเราควรส่งผ่านค่าไปยัง SpringMVC ผ่าน AJAX
ก่อนอื่นเราพยายามส่งวัตถุ JSON โดยตรง
// กำหนด json object var username = $ ("#username"). val (); รหัสผ่าน var = $ ("#รหัสผ่าน"). val (); var json = {"ชื่อผู้ใช้": ชื่อผู้ใช้ "รหัสผ่าน": รหัสผ่าน}; // jQuery ajax ขอ $ .ajax ({url: "jSontest", พิมพ์: "โพสต์", async: จริง, ข้อมูล: json, datatype: 'json', ความสำเร็จ } else {if ($ ("#errormsg"). ความยาว <= 0) {$ ("ฟอร์ม [name = loginform]") ภาคผนวก (errormsg);}}}});ก่อนอื่นลองคิดดูว่า SpringMVC ให้อะไรกับเรา มีคำอธิบายประกอบของ @requestparam สำหรับคำอธิบายประกอบนี้ฟังก์ชั่นของมันนั้นเหมือนกับ request.getParameter ใน servlet ของเรา ก่อนอื่นเราใช้คำอธิบายประกอบนี้เพื่อรับมัน
@RequestMapping ("/jSontest") การทดสอบโมฆะสาธารณะ (@RequestParam (value = "ชื่อผู้ใช้", จำเป็น = true) ชื่อผู้ใช้สตริง, @requestParam (value = "รหัสผ่าน", รหัสผ่านสตริงจริง) {System.out.println ("ชื่อ" System.out.println ("รหัสผ่าน:" + รหัสผ่าน); -พารามิเตอร์ของเราประสบความสำเร็จในการส่งออกจากพื้นหลังได้รับการยอมรับสำเร็จ!
SpringMVC นั้นฉลาดมากถ้าเราลบคำอธิบายประกอบ @requestparam จะเกิดอะไรขึ้นถ้าเราใส่สองค่าโดยตรง
@RequestMapping ("/jSontest") การทดสอบโมฆะสาธารณะ (ชื่อผู้ใช้สตริง, รหัสผ่านสตริง) {System.out.println ("ชื่อผู้ใช้:" + ชื่อผู้ใช้); System.out.println ("รหัสผ่าน:" + รหัสผ่าน); -มันประสบความสำเร็จจริงๆ ฉันจะไม่อธิบายรายละเอียดเกี่ยวกับหลักการที่นี่ เพื่อนที่สนใจสามารถทำลายจุดและดู
SpringMVC จัดเตรียม @RequestBody ซึ่งใช้ในการประมวลผลข้อมูลที่ส่งโดยประเภทเนื้อหาความหมายเบื้องหน้า: ไม่ใช่แอปพลิเคชัน/X-WWW-FORM-URLENCODED การเข้ารหัสเช่น Application/JSON, Application/XML ฯลฯ ;
เพื่อนที่ระมัดระวังอาจค้นพบว่าใน AJAX ก่อนหน้านี้เราไม่ได้กำหนดประเภทประเภทเนื้อหาและ jQuery ใช้ประเภทแอปพลิเคชัน/x-www-form-urlencoded ตามค่าเริ่มต้น นั่นหมายถึงคำอธิบายประกอบ @RequestParam ของ SpringMVC และคำขอของ Servlet GetParameter สามารถยอมรับวัตถุ JSON ที่ส่งในรูปแบบนี้
ทำไม! - ฉันเชื่อว่าทุกคนคุ้นเคยกับคำขอรับ มันส่งพารามิเตอร์ไปยังเซิร์ฟเวอร์ในรูปแบบของ URL? ชื่อผู้ใช้ =” ผู้ดูแลระบบ” & รหัสผ่าน = 123 และคำขอ GetParameter สามารถรับพารามิเตอร์นี้ได้ นอกจากนี้เรายังสามารถเห็นสิ่งนี้ในแถบที่อยู่เบราว์เซอร์ สำหรับโพสต์ที่เราใช้ใน AJAX และส่งวัตถุ JSON เราจะนำมันไปอยู่เบื้องหลังได้อย่างไร คำตอบอยู่ในวิธีการเข้ารหัสของเนื้อหาประเภท X-WWW-FORM-URLENCODED แปลงข้อมูล JSON เป็นสตริง (ชื่อผู้ใช้ =” ผู้ดูแลระบบ” & รหัสผ่าน = 123) และเพิ่มสตริงนี้ลงใน URL และใช้งาน? การแบ่งส่วน (มันคล้ายกับวิธีการรับมาก) เมื่อวิธีการส่งเป็นโพสต์เบราว์เซอร์จะห่อหุ้มข้อมูลลงในตัว HTTP แล้วส่งไปยังเซิร์ฟเวอร์ ดังนั้นจะไม่แสดงบน URL (ย่อหน้านี้อาจจะบิดเล็กน้อยฉันหวังว่าทุกคนจะเข้าใจได้อย่างรอบคอบ)
ในที่สุดก็พูดเสร็จหายใจถอนหายใจนาน ดังนั้นเมื่อเราใช้คำอธิบายประกอบ @requestbody ประเภทเนื้อหาของแผนกต้อนรับจะต้องเปลี่ยนเป็นแอปพลิเคชัน/JSON หากไม่มีการเปลี่ยนแปลงแผนกต้อนรับส่วนหน้าจะรายงานข้อผิดพลาด 415 (ประเภทสื่อที่ไม่ได้รับการสนับสนุน) บันทึกพื้นหลังจะรายงานประเภทเนื้อหาข้อผิดพลาด 'แอปพลิเคชัน/x-www-form-urlencoded; charset = utf-8' ไม่รองรับ ข้อผิดพลาดเหล่านี้จะไม่ปรากฏใน Tomcat ภายใต้ Eclipse มันจะปรากฏเฉพาะเมื่อมีการใช้บันทึก คุณสามารถอ่านบทความก่อนหน้าของฉันเกี่ยวกับวิธีกำหนดค่าบันทึก ถัดไปกำหนดค่าให้ถูกต้อง ดังกล่าวข้างต้นว่าต้องมีการเปลี่ยนแปลงประเภทเนื้อหาและข้อมูลของเราจะต้องเปลี่ยนแปลง วิธีการเพิ่มความคิดเห็นนี้ยอมรับเฉพาะสตริง JSON แทนวัตถุ JSON
$ .ajax ({url: "jSontest", พิมพ์: "โพสต์", async: จริง, contentType: "แอปพลิเคชัน/JSON", ข้อมูล: json.stringify (JSON), ประเภทข้อมูล: 'JSON', ความสำเร็จ: ฟังก์ชั่น (ข้อมูล) {if (data.userstatus === ($ ("#errormsg"). ความยาว <= 0) {$ ("ฟอร์ม [name = loginform]") ภาคผนวก (errormsg);}}}});พื้นหลังยังเปลี่ยนแปลง JSON สามารถเข้าใจได้จริงเป็นคู่คีย์-ค่าดังนั้นเราจึงใช้ MAP เพื่อรับและประมวลผลสตริงหรือประเภทข้อมูลอื่น ๆ เพิ่มเติม
@RequestMapping ("/jSontest") การทดสอบโมฆะสาธารณะ (@requestbody (จำเป็น = = จริง) แผนที่ <สตริงวัตถุ> แผนที่) {สตริงผู้ใช้ = map.get ("ชื่อผู้ใช้") toString (); สตริงรหัสผ่าน = map.get ("รหัสผ่าน"). toString (); System.out.println ("ชื่อผู้ใช้:" + ชื่อผู้ใช้); System.out.println ("รหัสผ่าน:" + รหัสผ่าน); -ในเวลาเดียวกันฉันจำได้ว่า SpringMVC วิเศษอีกครั้งดังนั้นฉันจึงตัดสินใจลบคำอธิบายประกอบและลอง ตกลงฉันระเบิดอย่างเด็ดขาดด้วยข้อผิดพลาดตัวชี้โมฆะ ... ฉันพยายามหยุดมัน
SpringMVC ยังมีวิธีการผูกพารามิเตอร์โดยตรงกับ POJO ลองมาลองดูสิ แผนกต้อนรับเหมือนกันดังนั้นฉันจะไม่โพสต์
@RequestMapping ("/jSontest") การทดสอบโมฆะสาธารณะ (@requestbody ผู้ใช้ผู้ใช้) {string username = user.getUserName (); สตริงรหัสผ่าน = user.getPassword (); System.out.println ("ชื่อผู้ใช้:" + ชื่อผู้ใช้); System.out.println ("รหัสผ่าน:" + รหัสผ่าน); -ตกลงคราวนี้คุณจะได้รับค่า โดยส่วนตัวฉันไม่ชอบวิธีนี้สำหรับการอัปโหลดปริมาณข้อมูลขนาดเล็กเช่นเข้าสู่ระบบ มีตัวแปรมากมายในผู้ใช้ ฉันใช้เพียงสองคนเท่านั้น ไม่จำเป็นต้องสร้างวัตถุผู้ใช้ โดยทั่วไปเมื่อปริมาณข้อมูลมีขนาดเล็กฉันยังคงต้องการใช้ค่าแยกต่างหากเพื่อรับ ลองคิดดูอีกครั้งถ้าเราอัปโหลดวัตถุ JSON เราจะผูก Pojo ได้ไหม? คำตอบคือใช่ อย่าใช้คำอธิบายประกอบ @RequestParam มิฉะนั้นพารามิเตอร์ผู้ใช้ที่ต้องการ 'ผู้ใช้' จะไม่เกิดข้อผิดพลาด คำอธิบายนั้นอยู่ที่นี่โดยสรุปให้สรุปด้านล่าง
ก่อนอื่นเราพูดถึงวัตถุ JSON และสตริง JSON
จากนั้นเมื่อ SpringMVC ยอมรับรูปแบบ JSON สองหรือสองรูปแบบการตั้งค่า contentType front-end และไม่ว่าแบ็คเอนด์จะใช้คำอธิบายประกอบเพื่อยอมรับมันหรือไม่
เมื่อ Ajax ถูกอัปโหลดในรูปแบบแอปพลิเคชัน/x-www-form-urlencoded จำเป็นต้องใช้ @requestparam หรือ servlet เพื่อรับในพื้นหลัง เมื่อ AJAX ถูกอัปโหลดในรูปแบบแอปพลิเคชัน/JSON จะใช้ Strings JSON พื้นหลังจะต้องใช้ @RquestBody เพื่อรับ
นี่คือบทสรุปของการทดลองของฉันเป็นเวลาหนึ่งวัน ฉันหวังว่ามันจะช่วยคุณได้ หากมีข้อผิดพลาดใด ๆ โปรดยกโทษให้ฉันและแก้ไขฉัน
คำอธิบายโดยละเอียดข้างต้นของพารามิเตอร์ JSON ที่ยอมรับโดย SpringMVC และสรุปข้อผิดพลาดทั่วไปคือเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น