2010-10-18 26 views
10

Tôi đã có ứng dụng Spring MVC được phục vụ trong Tomcat. Khi người dùng nhập vào một trang mà không được tìm thấy, nó sẽ hiển thị trang mặc định 404 của tôi, như quy định trong web.xmlCách đặt trang 404 tùy chỉnh là chuyển tiếp, không phải chuyển hướng trong Tomcat

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

Vấn đề là nếu người dùng đi vào http://mydomain/bad/url

nó được chuyển hướng đến http://mydomain/errors/404/

Điều này gây phiền toái, bởi vì nếu người dùng nhập sai URL thật khó để xem lỗi đó là gì và sửa lỗi đó.

Sau lỗi 404, tôi muốn giữ URL gốc nhưng hiển thị trang lỗi. (ví dụ: chuyển tiếp, không phải chuyển hướng). Đó là ấn tượng của tôi về cách hầu hết các máy chủ web hoạt động. Điều này có thể không?

+0

Nếu mục tiêu của bạn là nhận URL ban đầu gây ra 404, wont req.getAttribute ("javax.servlet.error.request_uri") phù hợp với bạn? – JoseK

+0

Mẹo hay - không biết về điều đó. Nhưng mục tiêu của tôi là thân thiện với người dùng. Tôi muốn URL duy trì ở giá trị xấu để người dùng có thể xem, nhưng phân phối trang lỗi. –

+0

bạn sẽ tự trả lời và đóng câu hỏi? Trân trọng. – mschonaker

Trả lời

4

Tôi hoàn toàn không hiểu tại sao điều này hoạt động theo cách nó làm, nhưng ...

tôi đã phát hiện ra rằng nếu bạn đặt mã trạng thái và có một phản hồi trống (hoặc nếu bạn cố gắng để chuyển tiếp tới các trang báo lỗi), Tomcat sẽ chuyển hướng đến trang báo lỗi:

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

Nhưng nếu bạn hỏi Tomcat để gửi trang, nó sẽ chỉ về phía trước và để lại địa chỉ URL trong tình trạng ban đầu, như tôi đang tìm kiếm.

((HttpServletResponse) response).setStatus(HttpServletResponse.SC_NOT_FOUND); 
((HttpServletResponse) response).sendError(HttpServletResponse.SC_NOT_FOUND); 
+0

Bạn chỉ nên gọi sendError(). Nó đặt trạng thái. Chỉ sử dụng setStatus() nếu bạn định cung cấp nội dung. –

Các vấn đề liên quan