ภาพรวม
บทความนี้จะมุ่งเน้นไปที่การใช้การเปลี่ยนเส้นทางในฤดูใบไม้ผลิและหารือเกี่ยวกับเหตุผลที่อยู่เบื้องหลังแต่ละกลยุทธ์
ทำไมต้องเปลี่ยนเส้นทาง?
ก่อนอื่นให้พิจารณาว่าทำไมคุณอาจต้องเปลี่ยนเส้นทางในแอปพลิเคชันฤดูใบไม้ผลิของคุณ
แน่นอนว่ามีตัวอย่างและเหตุผลมากมายที่เป็นไปได้ ข้อมูลง่าย ๆ อาจเป็นข้อมูลแบบฟอร์มโพสต์รอบ ๆ การส่งปัญหาสองครั้งหรือเพียงแค่มอบหมายการดำเนินการไหลไปยังวิธีการควบคุมอื่น
สิ่งหนึ่งที่ควรทราบคือรูปแบบการโพสต์/การเปลี่ยนเส้นทาง/รับทั่วไปไม่ได้แก้ไขปัญหาการกระทำคู่อย่างเพียงพอ - ปัญหาของการรีเฟรชหน้าก่อนการกระทำครั้งแรกเสร็จสมบูรณ์อาจส่งผลให้เกิดการกระทำคู่
เปลี่ยนเส้นทางโดยใช้ RedirectView
เริ่มต้นด้วยวิธีง่ายๆนี้ - ลองยกตัวอย่างโดยตรง:
ด้านหลัง RedirectView จะยิง httpservletResponse.sendrect () - สิ่งนี้จะดำเนินการเปลี่ยนเส้นทางจริง
โปรดทราบว่าเราฉีดคุณสมบัติการเปลี่ยนเส้นทางไปยังวิธีการที่นี่อย่างไร - กรอบทำงานส่วนนี้ของงานหนักนี้ช่วยให้เราสามารถโต้ตอบกับคุณสมบัติเหล่านี้ได้
เราเพิ่มแอตทริบิวต์ลงในโมเดล RedirectAttributes - เปิดเผยเป็นพารามิเตอร์การสืบค้น HTTP แบบจำลองมีวัตถุ - โดยปกติแล้วสตริงหรือวัตถุที่สามารถแปลงเป็นสตริงได้
ตอนนี้ลองทดสอบฟังก์ชั่นการเปลี่ยนเส้นทางของเรา - ใช้คำสั่ง Curl อย่างง่ายเพื่อช่วยด้วย:
ผลลัพธ์จะเป็น:
เปลี่ยนเส้นทางโดยใช้การเปลี่ยนเส้นทาง: คำนำหน้า
วิธีการก่อนหน้านี้ใช้ RedirectView เพราะมันไม่เหมาะสมด้วยเหตุผลบางประการ
ก่อนอื่นเราจะเชื่อมต่อกับ Spring API เพราะเราใช้ RedirectView โดยตรงในรหัสของเรา
ประการที่สองเราจำเป็นต้องรู้ตั้งแต่เริ่มต้นว่าเมื่อดำเนินการควบคุมการควบคุมผลลัพธ์ของมันจะถูกเปลี่ยนเส้นทางเสมอ แต่นี่ไม่ใช่กรณีเสมอไป
ตัวเลือกที่ดีกว่าคือการใช้การเปลี่ยนเส้นทาง: คำนำหน้า - ชื่อมุมมองเปลี่ยนเส้นทางถูกฉีดเข้าไปในคอนโทรลเลอร์เช่นชื่อมุมมองตรรกะอื่น ๆ คอนโทรลเลอร์ไม่รู้ด้วยซ้ำว่าการเปลี่ยนเส้นทางกำลังเกิดขึ้น
ดูเหมือนว่า:
เมื่อชื่อมุมมองถูกส่งคืนด้วยการเปลี่ยนเส้นทาง:, คลาส URLBASEDViewResolver (และคลาสย่อยทั้งหมด) ตระหนักว่ามันเป็นข้อบ่งชี้พิเศษที่ต้องเปลี่ยนเส้นทาง ส่วนที่เหลือของชื่อมุมมองจะถือว่าเป็น URL เปลี่ยนเส้นทาง
มีสถานที่ที่ควรทราบที่นี่ - เมื่อเราใช้การเปลี่ยนเส้นทาง:/redirectedurl มุมมองเชิงตรรกะที่นี่เรากำลังทำการเปลี่ยนเส้นทางที่เกี่ยวข้องกับบริบท servlet ปัจจุบัน
หากคุณต้องการเปลี่ยนเส้นทางไปยัง URL แบบสัมบูรณ์เราสามารถใช้ชื่อเช่นนี้: เปลี่ยนเส้นทาง: http: // localhost: 8080/spring-redirect/redirectedurl
ตอนนี้เมื่อเราดำเนินการคำสั่ง curl:
เราจะได้รับการเปลี่ยนเส้นทางทันที:
ส่งต่อพร้อมคำนำหน้าไปข้างหน้า
ตอนนี้มาดูวิธีการทำสิ่งที่แตกต่างออกไปเล็กน้อย - การส่งต่อ
ก่อนที่จะดูรหัสลองมาดูบทสรุปที่รวดเร็วและระดับสูงของความหมายของการส่งต่อและการเปลี่ยนเส้นทาง:
การเปลี่ยนเส้นทางจะตอบสนองด้วย URL ใหม่ที่มีรหัสตอบกลับ 302 และส่วนหัวของตำแหน่ง จากนั้นเบราว์เซอร์/ไคลเอนต์จะส่งคำขอไปยัง URL ใหม่อีกครั้งไปข้างหน้าอย่างสมบูรณ์ทางด้านเซิร์ฟเวอร์ คอนเทนเนอร์ servlet ส่งต่อคำขอเดียวกันไปยัง URL เป้าหมาย URL ในเบราว์เซอร์ไม่จำเป็นต้องเปลี่ยน
ตอนนี้ลองดูที่รหัส:
เช่นการเปลี่ยนเส้นทาง:, ไปข้างหน้า: คำนำหน้าจะถูกแยกวิเคราะห์โดย urlbasedViewResolver และคลาสย่อย ภายในสิ่งนี้จะสร้าง InternalResourceView ซึ่งดำเนินการ requestDispatcher.forward () สำหรับมุมมองใหม่
เมื่อเราดำเนินการคำสั่งด้วย curl:
เราจะได้รับ HTTP 405 (ไม่อนุญาตให้ใช้วิธี):
ในกรณีนี้เรามีคำขอเดียวที่ส่งจากเบราว์เซอร์/ไคลเอนต์ไปยังฝั่งเซิร์ฟเวอร์เมื่อเทียบกับคำขอสองคำขอที่เรามีในโซลูชันการเปลี่ยนเส้นทาง ไม่จำเป็นต้องใช้คุณสมบัติที่เพิ่มเข้ามาโดยการเปลี่ยนเส้นทาง
คุณสมบัติที่มี Redirectattributes
ถัดไป - มาดูคุณสมบัติการผ่านในการเปลี่ยนเส้นทาง - ใช้ประโยชน์จากการเปลี่ยนเส้นทางในกรอบ:
ดังที่ได้กล่าวไว้ก่อนหน้านี้เราสามารถแทรกวัตถุคุณสมบัติลงในวิธีการโดยตรง - ซึ่งทำให้กลไกใช้งานง่ายมาก
นอกจากนี้โปรดทราบว่าเรายังเพิ่มแอตทริบิวต์แฟลช - นี่คือคุณสมบัติที่จะไม่ถูกเพิ่มลงใน URL เราสามารถบรรลุคุณสมบัตินี้ - เราสามารถใช้ @ModelAttribute ("FlashAttribute") ในภายหลังในวิธีการเป้าหมายสุดท้ายที่เปลี่ยนเส้นทางเพื่อเข้าถึงแอตทริบิวต์ Flash:
ดังนั้นให้สำเร็จได้สำเร็จ - หากคุณต้องการใช้ Curl เพื่อทดสอบฟังก์ชั่น:
เราจะถูกเปลี่ยนเส้นทางไปยังตำแหน่งใหม่:
ด้วยวิธีนี้การใช้ RedirectAttRibures แทน ModelMap ทำให้เราสามารถแบ่งปันคุณสมบัติบางอย่างได้เฉพาะระหว่างสองวิธีที่เกี่ยวข้องในการดำเนินการเปลี่ยนเส้นทาง
การกำหนดค่าอื่นโดยไม่มีคำนำหน้า
ตอนนี้เรามาสำรวจการกำหนดค่าอื่น - การเปลี่ยนเส้นทางโดยไม่มีคำนำหน้า
เพื่อให้บรรลุเป้าหมายนี้เราจำเป็นต้องใช้ org.springframework.web.servlet.view.xmlviewResolver:
แทนที่จะเป็น org.springframework.web.servlet.view.internalresourceviewResolver ที่เราใช้ในการกำหนดค่าก่อนหน้านี้ของเรา:
นอกจากนี้เรายังต้องกำหนด redirectview bean ในการกำหนดค่า:
ตอนนี้เราสามารถอ้างถึงถั่วใหม่นี้ผ่าน ID เพื่อทริกเกอร์การเปลี่ยนเส้นทาง:
ในการทดสอบเราใช้คำสั่ง CURL อีกครั้ง:
ผลลัพธ์จะเป็น:
เปลี่ยนเส้นทางคำขอโพสต์ HTTP
สำหรับกรณีการใช้งานเช่นการชำระเงินของธนาคารเราอาจต้องเปลี่ยนเส้นทางคำขอโพสต์ HTTP ขึ้นอยู่กับรหัสสถานะ HTTP ที่ส่งคืนคำขอโพสต์สามารถเปลี่ยนเส้นทางไปยัง HTTP Get หรือ Post ได้
ตามการอ้างอิงโปรโตคอล HTTP 1.1 รหัสสถานะ 301 (ลบอย่างถาวร) และ 302 (พบ) อนุญาตให้ใช้วิธีการร้องขอจากการโพสต์เพื่อรับ ข้อมูลจำเพาะยังกำหนดรหัสสถานะ 307 ที่เกี่ยวข้อง (การเปลี่ยนเส้นทางชั่วคราว) และ 308 (การเปลี่ยนเส้นทางถาวร) ที่ไม่อนุญาตให้เปลี่ยนวิธีการร้องขอจากโพสต์เพื่อรับ
ทีนี้ลองดูที่รหัสเพื่อเปลี่ยนเส้นทางคำขอโพสต์ไปยังคำขอโพสต์อื่น:
ทีนี้มาใช้คำสั่ง CURL เพื่อทดสอบโพสต์ที่เปลี่ยนเส้นทาง:
เรากำลังถูกเปลี่ยนเส้นทางไปยังที่อยู่ปลายทาง:
สรุปแล้ว
บทความนี้แนะนำสามวิธีที่แตกต่างกันในการใช้การเปลี่ยนเส้นทางในฤดูใบไม้ผลิวิธีจัดการ/ส่งผ่านแอตทริบิวต์เมื่อทำการเปลี่ยนเส้นทางเหล่านี้และวิธีการจัดการการเปลี่ยนเส้นทางของคำขอโพสต์ HTTP
ข้างต้นเป็นคู่มือการเปลี่ยนเส้นทาง VSPRING (เปลี่ยนเส้นทาง) และปัญหากลยุทธ์ที่เกี่ยวข้องที่แนะนำโดยบรรณาธิการ ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!