วิธีทำให้เพจ 404 แบบกำหนดเองเป็นการส่งต่อ ไม่ใช่การเปลี่ยนเส้นทางใน Tomcat

ฉันมีแอป Spring MVC ที่ให้บริการใน Tomcat เมื่อผู้ใช้เข้าสู่เพจที่ไม่พบ มันจะแสดงเพจ 404 เริ่มต้นของฉันดังที่ตั้งไว้ใน web.xml

<error-page>
   <error-code>404</error-code>
   <location>/errors/404/</location>
</error-page>

ปัญหาคือถ้าผู้ใช้ไปที่ http://mydomain/bad/url

มันถูกเปลี่ยนเส้นทางไปที่ http://mydomain/errors/404/

สิ่งนี้น่ารำคาญ เพราะหากผู้ใช้พิมพ์ URL ไม่ถูกต้อง ก็ยากที่จะดูว่าข้อผิดพลาดคืออะไรและแก้ไขให้ถูกต้อง

หลังจากเกิดข้อผิดพลาด 404 ฉันต้องการให้คง URL เดิมไว้ แต่แสดงหน้าข้อผิดพลาด (เช่น การส่งต่อ ไม่ใช่การเปลี่ยนเส้นทาง) นั่นคือความประทับใจของฉันเกี่ยวกับการทำงานของเว็บเซิร์ฟเวอร์ส่วนใหญ่ เป็นไปได้ไหม?


person Will Glass    schedule 18.10.2010    source แหล่งที่มา
comment
หากเป้าหมายของคุณคือการได้รับ URL ดั้งเดิมซึ่งทำให้เกิด 404 req.getAttribute(javax.servlet.error.request_uri) จะไม่ทำงานให้คุณใช่ไหม   -  person JoseK    schedule 19.10.2010
comment
เคล็ดลับที่ดี - ไม่รู้เกี่ยวกับเรื่องนั้น แต่เป้าหมายของฉันคือความเป็นมิตรต่อผู้ใช้ ฉันต้องการให้ URL ยังคงเป็นค่าที่ไม่ดีเพื่อให้ผู้ใช้สามารถเห็นได้ แต่ส่งหน้าข้อผิดพลาด   -  person Will Glass    schedule 20.10.2010
comment
คุณจะตอบตัวเองและปิดคำถามหรือไม่? ความนับถือ.   -  person Martín Schonaker    schedule 31.05.2011


คำตอบ (1)


ฉันไม่ค่อยเข้าใจว่าทำไมสิ่งนี้ถึงได้ผล แต่...

ฉันค้นพบว่าหากคุณตั้งรหัสสถานะและไม่มีการตอบกลับ (หรือหากคุณพยายามส่งต่อไปยังหน้าข้อผิดพลาด) Tomcat จะเปลี่ยนเส้นทางไปยังหน้าข้อผิดพลาด:

((HttpServletResponse) response).setStatus(HttpServletResponse.SC_NOT_FOUND);

แต่ถ้าคุณขอให้ Tomcat ส่งเพจ มันก็จะส่งต่อและปล่อยให้ URL อยู่ในสถานะดั้งเดิมอย่างที่ฉันกำลังมองหา

((HttpServletResponse) response).setStatus(HttpServletResponse.SC_NOT_FOUND);
((HttpServletResponse) response).sendError(HttpServletResponse.SC_NOT_FOUND);
person Will Glass    schedule 12.06.2011
comment
คุณควรโทรหา sendError() มันกำหนดสถานะ ใช้ setStatus() เฉพาะในกรณีที่คุณต้องการจัดเตรียมเนื้อหาด้วย - person Lawrence Kesteloot; 08.03.2012