2012-02-29 37 views
6

Tôi đã tìm hiểu trên web sau khi khắc phục sự cố vào chiều nay @ làm việc trong đó Cookie được thêm vào HttpServletResponse không được phản ánh đúng trong tiêu đề phản hồi vì Servlet của chúng tôi đã truy xuất PrintWriter của phản hồi (tức là response.getWriter()) trước khi chúng tôi thêm cookie. Bây giờ tôi biết rằng thực tiễn tốt nhất ra lệnh sửa đổi tiêu đề phản hồi (tức là thiết lập loại nội dung, thêm/chỉnh sửa Cookie, v.v.) phải được thực hiện trước cuộc gọi đến getWriter() nhưng, điều tôi đang tìm kiếm là: Tại sao?Tại sao tiêu đề HttpServletResponse không được cập nhật SAU getWriter() được gọi?

Chúng tôi đã suy đoán về lý do tại sao truy xuất PrintWriter có hiệu lực làm đóng băng các tiêu đề phản hồi nhưng tại sao đặc tả Servlet thực thi điều đó?

Trả lời

11

Mục Headers SRV.5.2 của Java ™ Servlet Specification Version 2,4

Để được truyền lại thành công cho khách hàng, tiêu đề phải được đặt trước phản ứng được thực hiện. Các tiêu đề được đặt sau khi phản hồi được cam kết sẽ là bị bỏ qua bởi thùng chứa servlet.

Vì vậy, thông số kỹ thuật không đề cập rõ ràng getWriter() có ảnh hưởng đến việc đặt tiêu đề.

Tuy nhiên, việc triển khai vùng chứa servlet của bạn có thể đã chọn để xử lý câu trả lời là đã được comitted khi getWriter() được gọi. Điều đó khác biệt một cách tinh tế.

Trong một số vùng chứa mà tôi đã làm việc với bạn, bạn sẽ nhận được cảnh báo được ghi lại khi bạn cố đặt tiêu đề sau khi phản hồi được đính kèm.

Luôn luôn có giá trị gọi số getWriter() càng muộn càng tốt, vì bạn có thể muốn có cơ hội đặt mã hóa ký tự, v.v. phải được đặt trước khi getWriter() được gọi.

+0

Cảm ơn Paul! Điều đó có ý nghĩa. Vì vậy, có lẽ Tomcat quá hăng hái về thời điểm xem xét các tiêu đề đóng để sửa đổi. Sai lầm của tôi là giả định rằng bất kỳ dữ liệu nào chúng tôi đã viết cho cơ quan phản hồi trước khi gọi out.flush() về cơ bản là không được cam kết, nhưng đó có thể không phải là trường hợp. Cảm ơn một lần nữa! –

+0

Câu trả lời đáng yêu và tham khảo thú vị. Cảm ơn Paul. –

3

Vì tiêu đề đứng trước phần thân trong HTTP. Đó là lý do tại sao chúng được gọi là 'tiêu đề'. Nếu bạn gọi getWriter() bạn đang viết cho cơ thể, do đó, quá muộn để bắt đầu thay đổi giá trị tiêu đề phản hồi.

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