HTTP协议
HTTP是一种无状态协议,WEB服务器本身不能识别出哪些请求时同一个游览器发出的,游览器的每次请求都是完全孤立的。所以作为WEB服务器,必需采用一种机制来唯一标识一个用户,同时记录该用户的状态。
会话和会话状态
WEB应用中的会话是指一个客户端游览器与WEB服务器之间连续发生的一系列请求和响应过程。WEB应用的会话状态是指WEB服务器与游览器在会话过程中产生的状态信息,借助会话状态,WEB服务器能够把属于同一个会话的一系列请求和响应关联起来。
如何实现有状态的会话
WEB服务器端要能从大量的请求消息中区分出那些请求属于同一个会话,即能区分出来自同一个浏览器的访问请求。这需要浏览器对其发出的每个请求消息都进行标识,属于同一个会话中的请求消息都附带同样的标识符号,而属于不同会话的请求消息总是带不同的标识符号,这个符号就称之为会话ID(SessionID);
在Servlet规范中,常用以下两种机制完成会话跟踪:
1.Cookie
2.Session
Cookie机制
Cookie机制采用的是在客户端保持HTTP状态信息的方案。
Cookie是浏览器访问WEB服务器的某个资源时,由WEB服务器在HTTP相应消息头中附带传送给浏览器的一个小文本文件。一旦浏览器保存了某个Cookie,那么它以后每次访问该WEB服务器时,都会在HTTP请求头中将这个Cookie回传给WEB服务器。
Cookie的传送过程示意图
如图所示,第一次访问无cookie,第一次响应时服务器给游览器传递了cookie并写入了Cookie存储区。第二次及以后每次请求都会带上这个cookie。
下面是一个demo
目录结构
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>javaWeb_17</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>index</title>
</head>
<body>
<%
//1.创建一个Cookie
Cookie cookie= new Cookie("name","daochuwenziyao");
//2.调用response的addCookie方法,把Cookie传给客户端
response.addCookie(cookie);
%>
</body>
</html>
第一次访问
请求中无cookie信息,而相应头中有set-cookie:name=daochuwenziyao ,说明服务器传递给游览cookie.
第二次访问后
请求头中已带有cookie的信息。说明从cookie请求区中拿到了上次的cookie信息。
为了更加直观,我们改变index.jsp文件
(请在IE游览器下执行,其他游览器有运行不成功的状况发生)
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" session="false"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>index</title>
</head>
<body>
<%
Cookie[] cookies =request.getCookies();
//有cookie循环打印出来
if(cookies!=null&&cookies.length>0){
for(Cookie cookie:cookies){
out.print(cookie.getName()+":"+cookie.getValue());
out.print("<br>");
}
}
//无cookie
else{
out.print("没有一个cookie,正在创建cookie^");
//1.创建一个Cookie
Cookie cookie= new Cookie("name","daochuwenziyao");
//2.调用response的addCookie方法,把Cookie传给客户端
response.addCookie(cookie);
}
%>
</body>
</html>