Bagaimana cara menentukan halaman kesalahan default di web.xml?

138

Saya menggunakan <error-page>elemen di web.xml untuk menentukan halaman kesalahan ramah ketika pengguna menemukan kesalahan tertentu seperti kesalahan dengan kode 404:

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

Namun, saya ingin jika pengguna tidak menemukan kode kesalahan yang ditentukan <error-page>, dia akan melihat halaman kesalahan default. Bagaimana cara melakukannya menggunakan elemen di web.xml ?

ipkiss
sumber
2
Servletcontainer apa yang Anda gunakan / targetkan dan versi servlet apa yang Anda web.xmldeklarasikan? Hanya sejak Servlet 3.0 cara yang mudah.
BalusC
Saya menggunakan Tomcat 6, servlet 2.5
ipkiss

Jawaban:

242

Di Servlet 3.0 atau yang lebih baru, Anda bisa menentukannya

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

Tetapi karena Anda masih menggunakan Servlet 2.5, tidak ada cara lain selain menentukan setiap kesalahan HTTP umum satu per satu. Anda perlu mencari tahu kesalahan HTTP mana yang mungkin dihadapi oleh pengguna akhir. Pada aplikasi web barebone dengan misalnya penggunaan otentikasi HTTP, memiliki daftar direktori yang dinonaktifkan, menggunakan servlet dan kode khusus yang mungkin dapat membuang pengecualian yang tidak tertangani atau tidak memiliki semua metode yang diterapkan, maka Anda ingin mengaturnya untuk kesalahan HTTP 401 , 403, 500 dan 503 masing-masing.

<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>

Itu harus mencakup yang paling umum.

BalusC
sumber
Dapatkah Anda menentukan halaman kesalahan umum dan kemudian mengganti kode kesalahan tertentu dengan <error-code>tag?
Qix - MONICA DISALAHKAN
6
@Tomas: Orang-orang Tomcat memiliki masalah yang sama dengan Anda. Ini tidak disebutkan secara harfiah dalam spesifikasi, hanya gambar 14-10 dalam spesifikasi dan web.xmlfile XSD membuktikannya <error-code>dan <exception-type>menjadi opsional daripada wajib. Lihat masalah 52135 .
BalusC
java.sun.com/xml/ns/javaee/web-app_2_5.xsd menentukan tidak ada anak <description> untuk elemen <error-page>, jadi menempelkan kode di atas sebagaimana adanya di Servlet 2.5 web.xml akan menyebabkan XSD kesalahan validasi. Namun, jika saya berkomentar, itu berfungsi dengan baik, terima kasih!
László van den Hoek
1
@BalusC: Di manakah seharusnya halaman general-error.html (disebutkan dalam jawaban Anda) ditempatkan, di dalam WEB-INF? Saya memiliki masalah aneh dengan servlet 2.5 di mana untuk HTTP Error 403, saya telah membuat definisi <error-page> dan halaman error403.jsp berada di dalam WEB-INF dan karena ini halaman error403.jsp dimuat ketika ada sumber daya dicoba untuk mengakses tetapi gambar dan css dalam error403.jsp tidak dimuat membuat halaman terlihat salah tempat.
Jayy
@Kaipa: Cukup gunakan jalur relatif URL alih-alih jalur relatif konten web ke sumber daya CSS / JS / gambar. Banyak pemula yang salah mengira bahwa sumber daya tersebut diselesaikan di sisi server, tetapi sebenarnya diselesaikan di sisi klien. Lihat juga stackoverflow.com/questions/3655316/…
BalusC
24

Anda juga bisa melakukan hal seperti itu:

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

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

Untuk kode kesalahan 403 ini akan mengembalikan halaman 403.html, dan untuk kode kesalahan lainnya akan mengembalikan halaman error.html.

Orang
sumber
8

Anda juga dapat menentukan <error-page>untuk pengecualian menggunakan <exception-type>, misalnya di bawah ini:

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

Atau petakan kode kesalahan menggunakan <error-code>:

<error-page>
    <error-code>404</error-code>
    <location>/errorpages/404error.html</location>
</error-page>
Aniket Sahrawat
sumber