วิธีการระบุหน้าข้อผิดพลาดเริ่มต้นใน web.xml?


138

ฉันใช้<error-page>องค์ประกอบในweb.xmlเพื่อระบุหน้าข้อผิดพลาดที่เป็นมิตรเมื่อผู้ใช้พบข้อผิดพลาดบางอย่างเช่นข้อผิดพลาดด้วยรหัส 404:

<error-page>
        <error-code>404</error-code>
        <location>/Error404.html</location>
</error-page>

อย่างไรก็ตามฉันต้องการว่าหากผู้ใช้ไม่ตรงกับรหัสข้อผิดพลาดที่ระบุไว้ใน<error-page>เขาหรือเธอควรจะเห็นหน้าข้อผิดพลาดเริ่มต้น ฉันจะทำเช่นนั้นโดยใช้องค์ประกอบในweb.xml ได้อย่างไร


2
servletcontainer ใดที่คุณใช้ / กำหนดเป้าหมายและรุ่นของเซิร์ฟเล็ตที่คุณweb.xmlประกาศคืออะไร มีเพียงวิธีง่ายๆตั้งแต่ Servlet 3.0
BalusC

ฉันใช้ Tomcat 6, servlet 2.5
ipkiss

คำตอบ:


240

บน Servlet 3.0 หรือใหม่กว่าคุณสามารถระบุได้

<web-app ...>
    <error-page>
        <location>/general-error.html</location>
    </error-page>
</web-app>

แต่เมื่อคุณยังอยู่ใน Servlet 2.5 ไม่มีวิธีอื่นนอกจากระบุข้อผิดพลาด HTTP ทั่วไปทุกข้อ คุณต้องคิดว่าข้อผิดพลาด HTTP ใดที่ enduser อาจเผชิญ บนเว็บแอพแบร์โบนด้วยตัวอย่างเช่นการใช้การรับรองความถูกต้องของ HTTP, มีรายชื่อไดเรกทอรีที่ปิดใช้งาน, ใช้ servlets แบบกำหนดเองและรหัสซึ่งอาจโยนข้อยกเว้นที่ไม่สามารถจัดการได้หรือไม่มีวิธีการทั้งหมดที่นำมาใช้ , 403, 500 และ 503 ตามลำดับ

<error-page>
    <!-- Missing login -->
    <error-code>401</error-code>
    <location>/general-error.html</location>
</error-page>
<error-page>
    <!-- Forbidden directory listing -->
    <error-code>403</error-code>
    <location>/general-error.html</location>
</error-page>
<error-page>
    <!-- Missing resource -->
    <error-code>404</error-code>
    <location>/Error404.html</location>
</error-page>
<error-page>
    <!-- Uncaught exception -->
    <error-code>500</error-code>
    <location>/general-error.html</location>
</error-page>
<error-page>
    <!-- Unsupported servlet method -->
    <error-code>503</error-code>
    <location>/general-error.html</location>
</error-page>

ที่ควรครอบคลุมคนที่พบบ่อยที่สุด


คุณสามารถระบุหน้าข้อผิดพลาดทั่วไปแล้วแทนที่รหัสข้อผิดพลาดบางอย่างด้วย<error-code>แท็กได้หรือไม่
Qix - MONICA ถูกยกเลิกเมื่อ

6
@ โทมัส: พวก Tomcat มีปัญหาเช่นเดียวกับคุณ นี่ไม่ได้มีการกล่าวถึงอย่างแท้จริงในข้อมูลจำเพาะรูปที่ 14-10 ในข้อมูลจำเพาะและweb.xmlไฟล์ XSD พิสูจน์ได้<error-code>และ<exception-type>กลายเป็นทางเลือกแทนที่จะเป็นสิ่งที่จำเป็น ดูปัญหา 52135
BalusC

java.sun.com/xml/ns/javaee/web-app_2_5.xsdระบุว่าไม่มี <description> ชายด์สำหรับอิลิเมนต์ <error-page> ดังนั้นการวางโค้ดด้านบนตามที่อยู่ใน servlet 2.5 web.xml จะทำให้ XSD ข้อผิดพลาดในการตรวจสอบ ถ้าฉันแสดงความคิดเห็นพวกเขาแม้ว่ามันจะทำงานได้ดีขอบคุณ!
László van den Hoek

1
@BalusC: วางหน้า general-error.html (กล่าวถึงในคำตอบของคุณ) ไว้ที่ไหนใน WEB-INF ฉันมีปัญหาแปลก ๆ กับ servlet 2.5 ซึ่งสำหรับ HTTP Error 403 ฉันได้สร้างคำจำกัดความ <error-page> และหน้า error403.jsp ตั้งอยู่ภายในใน WEB-INF และด้วยเหตุนี้หน้า error403.jsp จึงโหลดเมื่อมี มีการพยายามเข้าถึงทรัพยากร แต่รูปภาพและ css ภายใน error403.jsp ไม่โหลดขึ้นมาทำให้หน้าดูไม่ถูกต้อง
Jayy

@Kaipa: เพียงใช้พา ธ ที่สัมพันธ์กับ URL แทนพา ธ ที่สัมพันธ์กับเนื้อหาของเว็บไปยังทรัพยากร CSS / JS / รูปภาพ ผู้เริ่มต้นจำนวนมากคิดว่าทรัพยากรเหล่านั้นไม่ได้รับการแก้ไขด้านเซิร์ฟเวอร์ แต่พวกเขาได้รับการแก้ไขด้านลูกค้าจริง ๆ แล้ว ดูstackoverflow.com/questions/3655316/…
BalusC

23

คุณสามารถทำอะไรเช่นนั้น:

<error-page>
    <error-code>403</error-code>
    <location>/403.html</location>
</error-page>

<error-page>
    <location>/error.html</location>
</error-page>

สำหรับรหัสข้อผิดพลาด 403 มันจะส่งคืนหน้า 403.html และสำหรับรหัสข้อผิดพลาดอื่น ๆ มันจะส่งกลับข้อผิดพลาดของหน้า.html


8

นอกจากนี้คุณยังสามารถระบุ<error-page>ข้อยกเว้นโดยใช้<exception-type>เช่นด้านล่าง:

<error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/errorpages/exception.html</location>
</error-page>

หรือแมปรหัสข้อผิดพลาดโดยใช้<error-code>:

<error-page>
    <error-code>404</error-code>
    <location>/errorpages/404error.html</location>
</error-page>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.