提出问题:
HTTP协议是一种无状态的协议,WEB服务器本身不能识别出哪些请求是同一个浏览器发出的,浏览器的每一次请求都是完全孤立的 即使 HTTP1.1 支持持续连接,但当用户有一段时间没有提交请求,连接也会关闭。
怎么才能实现网上商店中的购物车呢:某个用户从网站的登录页面登入后,再进入购物页面购物时,负责处理购物请求的服务器程序必须知道处理上一次请求的程序所得到的用户信息。*作为 web 服务器,必须能够采用一种机制来唯一地标识一个用户,同时记录该用户的状态
*
会话
WEB应用中的会话是指一个客户端浏览器与WEB服务器之间连续发生的一系列请求和响应过程。
WEB应用的会话状态是指WEB服务器与浏览器在会话过程中产生的状态信息,借助会话状态,*
如何实现有状态的会话
WEB服务器端程序要能从大量的请求消息中区分出哪些请求消息属于同一个会话,即能识别出来自同一个浏览器的访问请求,这需要浏览器对其发出的每个请求消息都进行标识:属于同一个会话中的请求消息都附带同样的标识号,而属于不同会话的请求消息总是附带不同的标识号,这个标识号就称之为会话ID(SessionID)。
在 Servlet 规范中,常用以下两种机制完成会话跟踪:
- Cookie
- Session
cookie机制
cookie机制采用的是在客户端保持 HTTP 状态信息的方案 。
Cookie是在浏览器访问WEB服务器的某个资源时,由WEB服务器在HTTP响应消息头中附带传送给浏览器的一个小文本文件。
一旦WEB浏览器保存了某个Cookie,那么它在以后每次访问该WEB服务器时,都会在HTTP请求头中将这个Cookie回传给WEB服务器。
底层的实现原理: WEB服务器通过在HTTP响应消息中增加SetCookie响应头字段将Cookie信息发送给浏览器,浏览器则通过在HTTP请求消息中增加Cookie请求头字段将Cookie回传给WEB服务器。
一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和值(VALUE)。
一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
浏览器一般只允许存放300个Cookie,其中允许每个站点最多20个Cookie,每个Cookie的大小限制为4KB。
实现代码
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/oneServlet")
public class OneServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public OneServlet() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
//HttpServletResponse接口中定义了一个getCookies方法,
//它用于从HTTP请求消息的Cookie请求头字段中读取所有的Cookie项.
Cookie[] cookies=request.getCookies();
if(cookies!=null&&cookies.length>0){
for(Cookie coo:cookies){
//getName cookie名
String name=coo.getName();
//getValue cookie值
String val=coo.getValue();
out.write(name+":"+val);
}
}
//创建cookie
Cookie cookie=new Cookie("name", "zhangsan");
// setMaxAge:设置cookie过期时间
// 默认值为-1,即只保存到浏览器的缓存中,不保存到文件中,即浏览器关闭则会删除cookie
// Age>0 – 保存N秒
// Age=0删除这个cookie,同时删除缓存和文件
cookie.setMaxAge(3);//以秒为单位
//将cookie发送给浏览器,响应头:Set-Cookie:name:zhangsan
response.addCookie(cookie);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
(未完待续。。。。)