HTTP协议是一种无状态的协议,web服务器本身不能识别出哪些请求是同一个浏览器发出的,浏览器的每一次请求丢都是完全孤立的,也就是说无法记录前一次请求的状态
作为web服务器,必须能够采用一种机制来唯一的表示一个用户,同时记录该用户的状态
会话
JavaWeb中,客户向某一服务器发出第一个请求开始,会话就开始了,直到客户关闭了浏览器会话结束
web应用中的会话指一个客户端浏览器与web服务器之间连续发生的一系列请求和响应过程
会话跟踪技术
会话跟踪技术:在一个会话的多个请求中共享数据
web应用的会话状态是指web服务器与浏览器在会话过程中产生的状态信息,借助会话状态,web服务器能够把属于同一会话中的请求和响应过程关联起来
如何实现有状态的会话
web服务器端程序要能从大量请求消息中区分出哪些消息属于同一个会话,即能识别出来同一个浏览器的访问请求,需要浏览器对其发出的每个请求消息都进行标识:属于同一个会话中的请求消息都附带统样的标识号,这个标识号称为会话ID
在Servlet规范中,常用以下两种机制完成会话跟踪
Cookie
Session
cookie机制
Cookie机制采用的在客户端保持HTTp状态信息的方案
Cookie会在浏览器访问web服务器某个资源时,web服务器在http响应过程中,消息头中附带传送给浏览器的一个文本文件
一旦web浏览器保存了某个cookie,那么它在以后每次访问web服务器时,都会在HTTP请求中将这个cookie回传给web服务器
一个cookie只能标识一种信息,它至少有一个标识该信息的名称(NAME)和设置值(VALUE)
一个web站点可以给一个web浏览器发送多个cookie,一个web浏览器也可存储多个web站点提供的cookie
cookie 规范
cookie大小上限为4kb
一个服务器最多在客户端浏览器上保存20个cookie;一个浏览器最多保存3000个coolie
注意:不同浏览器见是不共享cookie
在Servlet程序中使用cookie
Servlet API 中提供了一个javax.servlet.http.Cookie类来封装Cookie信息,包含生成Cookie信息和提取Cookie信息的各个属性的方法
Cookie例子
package com.org;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.UUID;
import javax.servlet.http.Cookie;
public class AServlet extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse resp)
throws ServletException,IOException{
String id= UUID.randomUUID().toString();
Cookie cookie=new Cookie ("id",id);
//cookie .setMaxAge(60*60);设置过期时间,成为持久cookie
resp.addCookie(cookie);
//发送cookie,使用addCookie()方法,将cookie插入到Set-Cookie HTTP响应报头中
PrintWriter out=resp.getWriter();
out.println("send id");
out.println("<a href='BServlet'>show Cookie</a>");
out.close();
}
public void doPost(HttpServletRequest req,HttpServletResponse resp)
throws ServletException,IOException{
this.doGet(req,resp);
}
}
package com.org;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class BServlet extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse resp)
throws ServletException,IOException{
PrintWriter out=resp.getWriter();
Cookie[] cs=req.getCookies();
if(cs!=null){
for(Cookie c:cs){
if(c.getName().equals("id")){
out.println("YOU ID IS:"+c.getValue());
}
}
}
out.close();
}
public void doPost(HttpServletRequest req,HttpServletResponse resp)
throws ServletException,IOException{
this.doGet(req,resp);
}
}
A com.org.AServlet A /AServlet B com.org.BServlet B /BServlet **cookie的发送** ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200419001635181.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpa2ViaWRpdQ==,size_16,color_FFFFFF,t_70) **Cookie的读取** ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200419001526343.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpa2ViaWRpdQ==,size_16,color_FFFFFF,t_70) **会话cookie和持久cookie区别** ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200418235849509.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpa2ViaWRpdQ==,size_16,color_FFFFFF,t_70) 可通过setMaxAge(int)来设置Cookie的有效时间 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200419001403494.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpa2ViaWRpdQ==,size_16,color_FFFFFF,t_70)