无论你的服务器使用了何种平台( Apache HTTPD Server 、 Java Servlet/JSP 、 Microsoft IIS ,……),只要你通过浏览器来访问,必须返回类似下面的 HTTP 响应:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=AywiPrQKPEzfF9OZ; Path=/
Content-Type: text/html;charset=GBK
Content-Language: zh-CN
Content-Length: 48
Date: Mon, 06 Nov 2006 07:59:38 GMT
<html>
<body>
……
我们注意到, HTTP 响应分为 Header 和 Content 两部分。从“ HTTP/1.1 200 OK ”开始,到“ <html> ”之前,都是 HTTP Header ,后面则为 HTTP Content 。而 cookie 是在 header 中指定的。一但应用服务器开始向浏览器输出 content ,那就再也没有机会修改 header 了。问题就出在这里。作为 session 的 cookie 可以在应用程序的任何时间被修改,甚至可能在 content 开始输出之后被修改。但是此后修改的 session 将不能被保存到 cookie 中。
Java Servlet API 的术语称“应用服务器开始输出 content ”为“ response 被提交”。你可以通过 response.isCommitted() 方法来判断这一点。那么,哪些操作会导致 response 被提交呢?
1. 向 response.getWriter() 或 getOutputStream() 所返回的流中输出,累计达到服务器所设定的一个 chunk 的大小,通常为 8K 。
2. 用户程序或系统调用 response.flushBuffer() 。
3. 用户程序或系统调用 response.sendError() 转到错误页面。
4. 用户程序或系统调用 response.sendRedirect() 重定向。
原文地址:http://opentech.alibaba-inc.com/web/guest/kb