HTTP协议本身是无状态的,即使是同一台电脑同一个浏览器打开同一个页面两次,服务器不知道这两次请求是同一个客户端发送过来的,两次请求是完全独立的。例如,第一次请求时已经登录了,第二次再请求服务器会“忘了”你已经登录过。
为了解决这个问题,就有了Cookie和Session。它们的出现是为了让服务器“记住”之前这个客户端的一些数据,让HTTP保持状态。
下面通过Java Socket实现的HTTP客户端来理解二者之间的原理,以及它们的区别和联系。
HTTP客户端:
Java实现的HTTP客户端有很多种,例如java.net包中的HttpURLConnection,Apache的开源工具HttpComponents。这些都是功能比较完善的HTTP客户端,但是为了看到最底层的HTTP请求和响应,这里用Socket来实现客户端。
下面是Java Socket实现的一个HTTP客户端,为了代码简洁,省略了资源关闭和异常处理:
public static void main(String[] args) throws Exception {
// 地址localhost,端口号8080
Socket socket = new Socket("localhost", 8080);
// 请求服务器
OutputStream out = socket.getOutputStream();
PrintWriter pw = new PrintWriter(out);
pw.println("GET /Test/test.jsp HTTP/1.1"); // 请求的第一行Request-Line,需要写请求的URL(/Test/test.jsp)
pw.println("Host: localhost:8080"); // 请求头,Host是必须的
pw.println(); // 一定要有个空行表示请求结束
pw.flush(); // 提交请求
// 获取服务器响应
InputStream is = socket.getInputStream();
InputStreamReader reader = new InputStreamReader(is);
// 输出响应内容
while (true) {
System.out.print((char)reader.read());
}
}
上面的HTTP客户端通过Socket发送一个最简单的HTTP GET请求到服务器的localhost:8080/Test/test.jsp页面:
GET /Test/test.jsp HTTP/1.1
Host: localhost