서블릿 서버 HTTP 응답
이전 섹션에서 설명한 것처럼 웹 서버가 HTTP 요청에 응답할 때 응답에는 일반적으로 상태 줄, 일부 응답 헤더, 빈 줄 및 문서가 포함됩니다. 일반적인 응답은 다음과 같습니다.
HTTP/1.1 200 OK Content-Type: text/html Header2: ... ... HeaderN: ... (Blank Line) <!doctype ...> <html> <head>...</head> <body> ... </body> </html>
상태 줄에는 HTTP 버전(이 경우 HTTP/1.1), 상태 코드(이 경우 200) 및 상태 코드에 해당하는 짧은 문자열이 포함됩니다. (이 경우에는 OK).
다음 표에는 웹 프로그래밍에서 자주 사용하게 될 웹 서버에서 브라우저로 반환되는 가장 유용한 HTTP 1.1 응답 헤더가 요약되어 있습니다.
头信息 | 描述 |
---|---|
Allow | 这个头信息指定服务器支持的请求方法(GET、POST 等)。 |
Cache-Control | 这个头信息指定响应文档在何种情况下可以安全地缓存。可能的值有:public、private 或 no-cache 等。Public 意味着文档是可缓存,Private 意味着文档是单个用户私用文档,且只能存储在私有(非共享)缓存中,no-cache 意味着文档不应被缓存。 |
Connection | 这个头信息指示浏览器是否使用持久 HTTP 连接。值 close 指示浏览器不使用持久 HTTP 连接,值 keep-alive 意味着使用持久连接。 |
Content-Disposition | 这个头信息可以让您请求浏览器要求用户以给定名称的文件把响应保存到磁盘。 |
Content-Encoding | 在传输过程中,这个头信息指定页面的编码方式。 |
Content-Language | 这个头信息表示文档编写所使用的语言。例如,en、en-us、ru 等。 |
Content-Length | 这个头信息指示响应中的字节数。只有当浏览器使用持久(keep-alive)HTTP 连接时才需要这些信息。 |
Content-Type | 这个头信息提供了响应文档的 MIME(Multipurpose Internet Mail Extension)类型。 |
Expires | 这个头信息指定内容过期的时间,在这之后内容不再被缓存。 |
Last-Modified | 这个头信息指示文档的最后修改时间。然后,客户端可以缓存文件,并在以后的请求中通过 If-Modified-Since 请求头信息提供一个日期。 |
Location | 这个头信息应被包含在所有的带有状态码的响应中。在 300s 内,这会通知浏览器文档的地址。浏览器会自动重新连接到这个位置,并获取新的文档。 |
Refresh | 这个头信息指定浏览器应该如何尽快请求更新的页面。您可以指定页面刷新的秒数。 |
Retry-After | 这个头信息可以与 503(Service Unavailable 服务不可用)响应配合使用,这会告诉客户端多久就可以重复它的请求。 |
Set-Cookie | 这个头信息指定一个与页面关联的 cookie。 |
HTTP 응답 헤더 설정 방법
서블릿 프로그램에서 HTTP 응답 헤더를 설정하려면 다음 방법을 사용할 수 있습니다. 이러한 메소드는 HttpServletResponse 객체를 통해 사용할 수 있습니다.
일련번호 | 방법 및 설명 |
---|---|
1 | String encodeRedirectURL(String url ) sendRedirect 메소드에 사용하기 위해 지정된 URL을 인코딩하거나, 인코딩이 필요하지 않은 경우 URL을 변경하지 않고 반환합니다. |
2 | String encodeURL(String url) 세션 ID가 포함된 지정된 URL을 인코딩하거나, 인코딩이 필요하지 않은 경우, 반환된 URL은 변경되지 않습니다. |
3 | boolean containHeader(String name) 명명된 응답 헤더가 설정되었는지 여부를 나타내는 부울 값을 반환합니다. |
4 | boolean isCommitted() 응답이 커밋되었는지 여부를 나타내는 부울 값을 반환합니다. |
5 | void addCookie(Cookie cookie) 지정된 쿠키를 응답에 추가합니다. |
6 | void addDateHeader(String name, long date) 주어진 이름과 날짜 값 마스트헤드가 포함된 응답을 추가합니다. |
7 | void addHeader(String name, String value) 주어진 이름과 값을 사용하여 응답 헤더를 추가합니다. |
8 | void addIntHeader(String name, int value) 주어진 이름과 정수 값 마스트헤드가 포함된 응답을 추가합니다. |
9 | void flashBuffer() 버퍼에 있는 모든 내용을 클라이언트에 강제로 기록합니다. |
10 | void Reset() 상태 코드 및 헤더를 포함하여 버퍼에 있는 모든 데이터를 지웁니다. |
11 | void ResetBuffer() 응답에서 기본 버퍼의 내용을 지우지만 상태 코드는 지우지 않습니다. 그리고 헤더. |
12 | void sendError(int sc) 지정된 상태 코드를 사용하여 클라이언트에 오류 응답을 보내고 버퍼를 지웁니다. . |
13 | void sendError(int sc, String msg) 지정된 상태를 사용하여 클라이언트에 오류 응답을 보냅니다. |
14 | void sendRedirect(String location) 지정된 리디렉션 위치 URL을 사용하여 클라이언트에 임시 리디렉션 응답을 보냅니다. |
15 | void setBufferSize(int size) 응답 본문에 적합한 버퍼 크기를 설정합니다. |
16 | void setCharacterEncoding(String charset) 클라이언트에 전송되는 응답의 문자 인코딩(MIME charset)을 설정합니다. , UTF-8. |
17 | void setContentLength(int len) HTTP 서블릿 응답에서 콘텐츠 본문의 길이를 설정합니다. HTTP Content-Length 헤더. |
18 | void setContentType(String type) 응답이 없는 경우 클라이언트에 보내는 응답 내용을 설정합니다. 아직 제출되지 않았습니다. |
19 | void setDateHeader(문자열 이름, 자세한 날짜) 주어진 이름과 날짜 값으로 응답 헤더를 설정합니다. |
20 | void setHeader(String name, String value) 주어진 이름과 값으로 응답 헤더를 설정합니다. |
21 | void setIntHeader(String name, int value) 주어진 이름과 정수 값 마스트헤드로 응답을 설정합니다. |
22 | void setLocale(Locale loc) 아직 응답이 제출되지 않은 경우 응답의 로캘을 설정합니다. |
23 | void setStatus(int sc) 이 응답에 대한 상태 코드를 설정합니다. |
HTTP 헤더 응답 예제
이전 예제에서 setContentType() 메서드를 보았으며 다음 예제에서도 동일하게 사용됩니다. 메서드 외에도 setIntHeader() 메서드를 사용하여 Refresh 헤더를 설정합니다.
// 导入必需的 java 库 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; // 扩展 HttpServlet 类 public class Refresh extends HttpServlet { // 处理 GET 方法请求的方法 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置刷新自动加载时间为 5 秒 response.setIntHeader("Refresh", 5); // 设置响应内容类型 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 = "自动刷新 Header 设置"; 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>当前时间是:" + CT + "</p>\n"); } // 处理 POST 方法请求的方法 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
이제 위의 서블릿을 호출하면 현재 시스템 시간이 5초마다 표시됩니다. 서블릿을 실행하고 잠시 기다리면 다음과 같은 결과가 표시됩니다.
自动刷新 Header 设置当前时间是:9:44:50 PM |