Gần đây tôi đã gặp sự cố với việc mã hóa các trang web được tạo bởi servlet, xảy ra nếu các servlet được triển khai dưới Tomcat, nhưng không phải dưới Cầu cảng. Tôi đã thực hiện một ít nghiên cứu về nó và đơn giản hóa vấn đề với servlet sau:Tại sao bộ mã hóa không được Tomcat trả lời? Làm thế nào tôi có thể đối phó với nó?
public class TestServlet extends HttpServlet implements Servlet {
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/plain");
Writer output = response.getWriter();
output.write("öäüÖÄÜß");
output.flush();
output.close();
}
}
Nếu tôi triển khai điều này dưới Cầu tàu và hướng trình duyệt đến nó, nó sẽ trả về kết quả mong đợi. Dữ liệu được trả lại dưới dạng ISO-8859-1 và nếu tôi xem xét các tiêu đề, thì Jetty sẽ trả về:
Content-Type: text/plain; charset=iso-8859-1
Trình duyệt phát hiện mã hóa từ tiêu đề này. Nếu tôi triển khai cùng một servlet trong Tomcat, trình duyệt sẽ hiển thị các ký tự lạ. Nhưng Tomcat cũng trả về dữ liệu như ISO-8859-1, sự khác biệt là, không có tiêu đề nào nói về nó. Vì vậy, trình duyệt phải đoán mã hóa và điều đó sai.
Câu hỏi của tôi là hành vi của Tomcat đúng hay lỗi? Và nếu nó là chính xác, làm thế nào tôi có thể tránh được vấn đề này? Chắc chắn, tôi luôn có thể thêm response.setCharacterEncoding("UTF-8");
vào servlet, nhưng điều đó có nghĩa là tôi đã đặt mã hóa cố định, trình duyệt có thể hoặc không hiểu. Vấn đề là phù hợp hơn, nếu không có trình duyệt nhưng một dịch vụ khác truy cập servlet. Vì vậy, làm thế nào tôi nên đối phó với vấn đề một cách linh hoạt nhất?
Btw: 'thực hiện Servlet' là không cần thiết là' HttpServlet' đã thực hiện điều đó. – BalusC