Như đã bàn luận trong chương trước, khi một Web Server phản hồi một HTTP Request tới trình duyệt, phản hồi đặc trưng bao gồm một dòng Status, một số trường Header, một dòng trống, và tài liệu. Một phản hồi đặc trưng giống như sau:
HTTP/1.1 200 OK Content-Type: text/html Header2: ... ... HeaderN: ... (Blank Line) <!doctype ...> <html> <head>...</head> <body> ... </body> </html>
Dòng Status gồm HTTP version (trong ví dụ là HTTP/1.1), một Status code ( trong ví dụ là 200), và một thông báo rất ngắn tương ứng với Status code (trong ví dụ là OK).
Dưới đây là các trường Header hữu ích nhất
Trong phản hồi HTTP 1.1 mà trở lại trình duyệt từ Web Server và bạn sẽ thường xuyên sử dụng chúng trong lập trình web:
Header | Miêu tả |
---|---|
Allow | Trường này xác định các phương thức yêu cầu (GET, POST, .v.v.) mà Server hỗ trợ |
Cache-Control | Trường này xác định các hoàn cảnh mà trong đó tài liệu phản hồi có thể được cache một cách an toàn. Nó có thể có các giá trị publics, private hoặc no-cache, .v.v.. Trong đó, publics nghĩa là tài liệu có thể được cache, private nghĩa là tài liệu dành cho một người sử dụng và chỉ có thể được lưu giữ riêng (không được chia sẻ) và no-cache nghĩa là tài liệu không bao giờ được cache |
Connection | Trường này chỉ dẫn trình duyệt có sử dụng persistent trong các kết nối HTTP hoặc không. Một giá trị close chỉ rằng trình duyệt không sử dụng các kết nối HTTP dạng persistent và keep-alive nghĩa là sử dụng các kết nối persistent |
Content-Disposition | Trường này cho bạn yêu cầu rằng trình duyệt hỏi người sử dụng để lưu phản hồi lên địa trong một file với tên đã cho |
Content-Encoding | Trường này xác định cách mà trang được mã hóa trong khi truyền tải |
Content-Language | Trường này xác định ngôn ngữ mà tài liệu được viết. Ví dụ en, en-us, ru, … |
Content-Length | Trường này xác định số byte trong phản hồi. Thông tin này chỉ cần thiết nếu trình duyệt đang sử dụng một kết nối HTTP dạng persistent (giá trị keep-alive) |
Content-Type | Trường này kiểu MIME (Multipurpose Internet Mail Extension) của tài liệu phản hồi |
Expires | Trường này xác định thời gian tại đó nội dung nên được xem là hết hạn và không bao giờ được cache nữa |
Last-Modified | Trường này chỉ dẫn khi tài liệu được thay đổi lần cuối. Sau đó Client có thể cache tài liệu này và cung cấp một date bởi một trường yêu cầu If-Modified-Since trong các yêu cầu sau đó |
Location | Trường này nên được bao với tất cả phản hồi mà có Status code là 300. Nó thông báo cho trình duyệt về địa chỉ tài liệu. Trình duyệt tự động kết nối lại tới vị trí này và thu nhận tài liệu mới |
Refresh | Trường này xác định khi nào trình duyệt nên đề nghị một trang đã được update. Bạn có thể xác định thời gian với đơn vị là số giây sau đó một trang sẽ được refresh |
Retry-After | Trường này có thể được sử dụng khi kết hợp với phản hồi 503 (Service Unavailable) để nói cho Client khi nào thì nó có thể lặp lại yêu cầu |
Set-Cookie | Trường này xác định một cookie mà liên kết với trang |
Các phương thức để thiết lập HTTP Response Header
Bảng dưới liệt kê các phương thức có thể được sử dụng để thiết lập HTTP Response Header trong chương trình Servlet. Các phương thức này có là có sẵn với đối tượng HttpServletResponse.
STT | Phương thức và Miêu tả |
---|---|
1 | String encodeRedirectURL(String url) Mã hóa URL đã cho để sử dụng trong phương thức sendRederect, hoặc nếu mã hóa này không được đòi hỏi, thì trả về URL như cũ |
2 | String encodeURL(String url) Mã hóa URL đã cho bằng việc thêm ID của session trong nó, hoặc nếu mã hóa này không được đòi hỏi, thì trả về URL như cũ |
3 | boolean containsHeader(String name) Trả về một Boolean chỉ rằng có hay không header phản hồi với tên đã cho đã được thiết lập |
4 | boolean isCommitted() Trả về một Boolean chỉ rằng nếu phản hồi đã được commit |
5 | void addCookie(Cookie cookie) Thêm cookie đã cho tới phản hồi |
6 | void addDateHeader(String name, long date) Thêm một header phản hồi với tên và giá trị date đã cho |
7 | void addHeader(String name, String value) Thêm một header phản hồi với tên và giá trị đã cho |
8 | void addIntHeader(String name, int value) Thêm một header phản hồi với tên và giá trị integer đã cho |
9 | void flushBuffer() Force bất kỳ nội dung nào trong Buffer để được ghi tới Client đó |
10 | void reset() Xóa bất dữ liệu nào tồn tại trong buffer cũng như Status code và các trường header |
11 | void resetBuffer() Xóa nội dung của buffer nằm dưới trong phản hồi mà không xóa các trường header và status code |
12 | void sendError(int sc) Gửi một phản hồi lỗi tới Client bởi sử dụng Status code đã cho và xóa buffer |
13 | void sendError(int sc, String msg) Gửi một phản hồi lỗi tới Client bởi sử dụng Status code đã cho |
14 | void sendRedirect(String location) Gửi một phản hồi Redirect tạm thời tới Client bởi sử dụng địc chỉ URL để Redirect đã cho |
15 | void setBufferSize(int size) Thiết lập kích cỡ buffer cho thân phản hồi |
16 | void setCharacterEncoding(String charset) Thiết lập mã hóa ký tự (MIME Charset) của phản hồi đang được gửi tới Client, ví dụ, thiết lập là UTF-8 |
17 | void setContentLength(int len) Thiết lập độ dài nội dung của thân phản hồi trong HTTP Servlet, phương thức này thiết lập trường header là HTTP Content-Length |
18 | void setContentType(String type) Thiết lập kiểu nội dung của phản hồi đang được gửi tới Client, nếu phản hồi vẫn chưa được commit |
19 | void setDateHeader(String name, long date) Thiết lập một header phản hồi với tên và giá trị date đã cho |
20 | void setHeader(String name, String value) Thiết lập một header phản hồi với tên và giá trị đã cho |
21 | void setIntHeader(String name, int value) Thiết lập một header phản hồi với tên và giá trị integer đã cho |
22 | void setLocale(Locale loc) Thiết lập Locale của phản hồi, nếu phản hồi vẫn chưa được commit |
23 | void setStatus(int sc) Thiết lập Status code cho phản hồi này |
Ví dụ về HTTP Header Response
Bạn đã thấy cách phương thức setContentType() làm việc trong ví dụ trước và ví dụ sau cũng sử dụng phương thức này, ngoài ra chúng ta sẽ sử dụng phương thức setIntHeader() để thiết lập trường Refresh Header:
// Import required java libraries import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; // Extend HttpServlet class public class Refresh extends HttpServlet { // Method to handle GET method request. public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Set refresh, autoload time as 5 seconds response.setIntHeader("Refresh", 5); // Set response content type response.setContentType("text/html"); // Get current time Calendar calendar = new GregorianCalendar(); String am_pm; int hour = calendar.get(Calendar.HOUR); int minute = calendar.get(Calendar.MINUTE); int second = calendar.get(Calendar.SECOND); if(calendar.get(Calendar.AM_PM) == 0) am_pm = "AM"; else am_pm = "PM"; String CT = hour+":"+ minute +":"+ second +" "+ am_pm; PrintWriter out = response.getWriter(); String title = "Auto Refresh Header Setting"; String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n"+ "<body bgcolor=\"#f0f0f0\">\n" + "<h1 align=\"center\">" + title + "</h1>\n" + "<p>Current Time is: " + CT + "</p>\n"); } // Method to handle POST method request. public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
Bây giờ gọi Servlet trên sẽ hiển thị System Time hiện tại sau mỗi 5s như sau. Bạn chạy và đợi để xem kết quả:
Auto Refresh Header Setting
Current Time is: 9:44:50 PM