获取请求头
获取请求头使用HttpServletRequest对象的getHeader()、getHeaders()、getHeaderNames()、getIntHeader()、getDateHeader()。
设置响应头
设置响应头可以使用HttpServletResponse对象上的setHeader()、addHeader()。setHeader()用于设置响应头名称与值,addHeader()是在同一个响应头名称上附加值。
如果响应头的值是整数,使用setIntHeader()、addIntHeader()方法。
如果响应头的值是日期,则可以使用setDateHeader()、addDateHeader()方法。
所有的标头设置,必须在响应确认之前,在响应确认之后设置的标头,会被容器忽略。
缓冲区
容器可以但非必要对响应进行缓冲,通常容器默认都会对响应进行缓冲。
关于缓冲区的API
HttpServletResponse有关缓冲的方法有:
1、getBufferSize()
返回当前缓冲区的大小,单位是字节,默认情况下是8192,即8KB大小
2、setBufferSize()
setBufferSize()必须在调用HttpServletResponse的getWriter()或getOutputStream()方法之前调用,这样,所取得的Writer或ServletOutputStream才会套用这个设置。
在调用HttpServletResponse的getWriter()或getOutputStream()方法之后调用setBufferSize(),会抛出IllegalStateException。
3、isCommitted()
在缓冲区未满之前,设置的响应相关内容都不会真正传至客户端,可以使用isCommitted()看看是否响应已确认。
4、reset()
如果想要重置所有响应信息,可以调用reset()方法,这会连同已设置的响应头和状态码一并清除。
5、resetBuffer()
调用resetBuffer()会重置响应内容,但不会清除已设置的响应头内容和状态码。
6、flushBuffer()
flushBuffer()会清除(flush)所有缓冲区中已设置的响应信息至客户端。
reset()、resetBuffer()必须在响应未确认前调用,如果在响应已确认后调用reset()、resetBuffer()会抛出IllegalStateException。
缓冲区刷新
HttpServletResponse对象若被容器关闭,则必须清除所有的响应内容,响应对象被关闭的时机点有以下几种:
1、Servlet的service()方法已结束。
2、响应的内容长度超过HttpServletResponse的setContentLength()所设置的长度。
响应的内容超过响应头中指定的body长度的上限时会自动刷新缓冲区,并关闭输出流;因为标头中规定body只能有这么多,超出部分不予以提交。
设置响应body大小上限的方法是:void HttpServletResponse.setContentLength(int len);单位是字节,该方法会直接设置Content-Length标头。
3、调用了sendRedirect()方法
4、调用了sendError()方法
5、调用了AsyncContext的complete()方法
另外,下面两种情况缓冲区也会刷新并输出到客户端
1、响应缓冲区已满。一个Response只有一个缓冲区,如果所有要提交给客户端的内容超过缓冲区大小,那么就会分若干次提交,每次缓冲区满就会提交一次。
2、手动调用flushBuffer方法
Demo


package com.test;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter;@WebServlet("/flush.do") public class BufferServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html; charset=UTF-8");// 设置body长度上限,设置为4000后,不会输出全文//response.setContentLength(4000);// 设置缓冲区大小,单位是字节,缺省情况下BufferSize大小是8192字节,即8192B,即或8KB//response.setBufferSize(8192*2);int bufferSize = response.getBufferSize();PrintWriter out = response.getWriter();// 输出缓存区大小out.println("缓存区大小: " + bufferSize);out.println("<!DOCTYPE html>");out.println("<html>");out.println("<head>");out.println("<meta charset=\"UTF-