Làm cách nào để chỉ định trang lỗi mặc định trong web.xml?


138

Tôi đang sử dụng <error-page>phần tử trong web.xml để chỉ định trang lỗi thân thiện khi người dùng gặp một lỗi nhất định, chẳng hạn như lỗi với mã 404:

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

Tuy nhiên, tôi muốn rằng nếu người dùng không đáp ứng bất kỳ mã lỗi nào được chỉ định trong <error-page>, họ sẽ thấy một trang lỗi mặc định. Làm cách nào tôi có thể làm điều đó bằng cách sử dụng phần tử trong tệp web.xml ?


2
Bạn đang sử dụng / nhắm mục tiêu servlet nào và phiên bản servlet nào được web.xmlkhai báo? Chỉ có từ Servlet 3.0 một cách dễ dàng.
BalusC

Tôi đang sử dụng Tomcat 6, servlet 2.5
ipkiss

Câu trả lời:


240

Trên Servlet 3.0 hoặc mới hơn, bạn có thể chỉ định

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

Nhưng vì bạn vẫn đang sử dụng Servlet 2.5, không có cách nào khác ngoài việc chỉ định từng lỗi HTTP phổ biến riêng lẻ. Bạn cần phải tìm ra lỗi HTTP nào mà trình kết thúc có thể gặp phải. Trên một ứng dụng web barebones, ví dụ như việc sử dụng xác thực HTTP, có một danh sách thư mục bị vô hiệu hóa, sử dụng các dịch vụ và mã tùy chỉnh có thể đưa ra các ngoại lệ chưa được xử lý hoặc không có tất cả các phương thức được triển khai, sau đó bạn muốn đặt nó cho các lỗi HTTP 401 , 403, 500 và 503 tương ứng.

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

Điều đó sẽ bao gồm những người phổ biến nhất.


Bạn có thể chỉ định một trang lỗi chung và sau đó ghi đè một số mã lỗi nhất định bằng <error-code>thẻ không?
Qix - MONICA ĐƯỢC PHÂN PHỐI

6
@Tomas: Những người Tomcat có cùng vấn đề với bạn. Đây không phải là nơi được đề cập theo nghĩa đen trong thông số kỹ thuật, chỉ có hình 14-10 trong thông số kỹ thuật và web.xmltệp XSD chứng minh điều đó <error-code><exception-type>trở thành tùy chọn thay vì bắt buộc. Xem vấn đề 52135 .
BalusC

java.sun.com/xml/ns/javaee/web-app_2_5.xsd chỉ định không có <description> con cho phần tử <error-page>, do đó, việc dán mã ở trên như trong tệp weblet của Servlet 2.5 sẽ gây ra XSD lỗi xác nhận. Nếu tôi nhận xét họ, mặc dù, nó hoạt động tốt, cảm ơn!
László van den Hoek 23/07/13

1
@BalusC: Trang General-error.html (được đề cập trong câu trả lời của bạn) nên được đặt ở đâu, bên trong WEB-INF? Tôi có một vấn đề kỳ lạ với servlet 2.5, trong đó đối với Lỗi HTTP 403, tôi đã tạo một định nghĩa <error-page> và trang error403.jsp nằm bên trong WEB-INF và vì điều này mà trang error403.jsp tải khi bất kỳ trong số các tài nguyên được cố gắng truy cập nhưng hình ảnh và css trong error403.jsp không được tải khiến trang bị thất lạc.
Jayy

@Kaipa: Chỉ cần sử dụng các đường dẫn liên quan đến URL thay vì các đường dẫn liên quan đến liên kết web với tài nguyên hình ảnh CSS / JS /. Rất nhiều người mới bắt đầu nghĩ sai rằng các tài nguyên đó được giải quyết phía máy chủ, nhưng chúng thực sự được giải quyết phía máy khách. Xem thêm stackoverflow.com/questions/3655316/ khăn
BalusC

23

Bạn cũng có thể làm một cái gì đó như thế:

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

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

Đối với mã lỗi 403, nó sẽ trả về trang 403.html và đối với bất kỳ mã lỗi nào khác, nó sẽ trả về trang error.html.


8

Bạn cũng có thể chỉ định <error-page>các trường hợp ngoại lệ bằng cách sử dụng <exception-type>, ví dụ bên dưới:

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

Hoặc ánh xạ mã lỗi bằng cách sử dụng <error-code>:

<error-page>
    <error-code>404</error-code>
    <location>/errorpages/404error.html</location>
</error-page>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.