1.会话
1、什么是会话?
打开浏览器,点击多次链接(发出多次请求和收到多次的响应),关闭浏览器,这个过程就是一次会话。
好比打电话,当对方接通之后,进行通话,当通话完毕之后挂掉了电话这就是一次会话。
2、解决的问题是什么?
共享多次请求中产生的数据。比如购物车。
假如购买了一件产品,这就是一次请求,但是你需要去付款,这也一次请求,是两个不同的请求,那么去付款的时候,所买的产品就不存在。那么请求转发将数据带过去可以的吗?这显然不是很方便。这时候就需要会话技术。
2.客户端技术:Cookie
2.1HTTP协议的消息头
请求消息头:Cookie 客户端向服务器端传递信息
响应消息头:Set-Cookie 服务器端向客户端传递信息
2.2cookie一些基本信息
Cookie详解:
l 属性:
name:Cookie的名称,必要的属性
value:Cookie的取值(不能为中文),必要的属性
-------------------以下为可选属性
path:Cookie的路径
默认值就是写cookie的那个资源的访问路径
比如:http://localhost:8080/day09_00_cookie/servlet/CookieDemo1 path就是/day09_00_cookie/servlet/
注意:
如果一个存在浏览器缓存中的cookie的路径是/day09/servlet/
当访问http://localhost:8080/day09/CookiePathDemo1时,浏览器根本不带Cookie给服务器。浏览器比对的是cookie的路径和当前访问的资源的路径。
浏览器满足一下条件就会带cookie给服务器:
当前访问的地址的路径.startWith(已存cookie的路径)。
即:如果一个Cookie的路径设置为了当前应用,说明访问该网站的任何资源时浏览器都带该cookie给服务器。(开发中经常做的)
maxAge:Cookie的最大生存时间。默认是在浏览器的内存中。
domain:Cookie的域名(网站)。默认就是写cookie的那个资源所属的网站。
http://localhost:8080/day09_00_cookie/servlet/CookieDemo1域名就是localhost
version:版本号
comment:注释
u 把Cookie写给客户端:
HttpServletResponse.addCookie(Cookie c):实际上就是向客户端发送了一个响应消息头。
注意:客户端只能保存一个网站最多20个Cookie数据,总共最多300个。每个Cookie的大小不能超过4kb。
l 服务器端获取客户端带来的Cookie:
Cookie [] HttpServletRequest.getCookies();
注意:domain+path+name唯一确定一个Cookie。
2.3代码
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//演示cookie的基本使用
public class CookieDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");//设置响应编码
PrintWriter out = response.getWriter();//获取输出流,用于向浏览器输出信息
out.write("您上次访问的时间是:");
//获取指定名称的cookie:lastAccessTime = 毫秒值
Cookie[] cs = request.getCookies();
//有可能是第一次登陆,所以cookie不存在,需要判断是否为空
for(int i = 0;cs != null && i< cs.length; i++){
//判断cookie是否存在
if("lastAccessTime".equals(cs[i].getName())){
long time = Long.parseLong(cs[i].getValue());
//out.write(new Date(time).toLocaleString());//转化为本地时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//转化为指定格式的时间
out.write(sdf.format(new Date()));
}
}
//把当前的时间写回去
Cookie c = new Cookie("lastAccessTime", System.currentTimeMillis()+"");//实例化Cookie对象,传入cooke名称和cookie的值
c.setMaxAge(Integer.MAX_VALUE);// 设置cookie的生命周期 单位是秒
response.addCookie(c);//将cookie写到本地
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
抓取的截图:
2.4清除cookie
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//清除指定的cookie
public class ClearTimeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//如何唯一定位要删除的cookie:domain+path+name
Cookie c = new Cookie("lastAccessTime", "");
c.setMaxAge(0);
response.addCookie(c);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
2.5cookie的path问题
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//演示Cookie的path
public class CookiePathDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//path:/day09/servlet/
Cookie c = new Cookie("demoCookie", "aaa");
c.setPath(request.getContextPath());// 把路径改为 /day09
c.setMaxAge(Integer.MAX_VALUE);
// c.setDomain("itheima.com");//写了白写
response.addCookie(c);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CookiePathDemo2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Cookie cs[] = request.getCookies();
for(int i=0;cs!=null&&i<cs.length;i++){
if("demoCookie".equals(cs[i].getName())){
//找到了
response.getWriter().write(cs[i].getValue());
}
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}