Cookie和Session会话技术
1. 一次会话包含多次请求和响应
2. 一次会话:直到有一方断开连接(会话的功能)
3. 会话的功能:**共享数据的**
4. 客户端会话技术:Cookie
5. 服务器端:Session
快速入门
1. 创建Cookie对象绑定数据new Cookie()
2. 发送cookie对象 response.addCookie()
3. 获取Cookie request.getCookie()
会话Cookie原理
- 客户端发送请求 ,服务器端接受请求 响应中响应头中包含了(set-cookie:msg=hello)
- 客户端接收到response之后会自动保存这个响应信息(msg=hello)
- 在下一次请求中 请求头中cookie:msg=hello,带着这个信息再次访问服务器
- 基于响应头set-cookie和请求头cookie来实现的
cookie的细节
1. 一次可以发送多少个cookie(多个Cookie)
`@WebServlet("/CookieServletDemo3")
public class CookieServletDemo3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = new Cookie("msg","hello");
Cookie cookie1 = new Cookie("name", "zhangsan");
response.addCookie(cookie);
response.addCookie(cookie1);
}
`
2. cookie在浏览器中保存多长时间
1. 默认情况下:浏览器关闭之后, Cookie被销毁
2. 设置Cookie生命周期 持久化存储
3. setMaxAge(int seconds)正数,负数,零 (参数存活时间) 参数为零 代表删除Cookie信息 正数:持久化到磁盘中
@WebServlet ("/CookieServletDemo4")
public class CookieServletDemo4 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = new Cookie("msg","hello");
// cookie.setMaxAge(100);//设置为正数, 持久化磁盘一百秒 之后自动删除
//cookie.setMaxAge(0); //设置为零 删除cookie
cookie.setMaxAge(-1);//设置为负数, 关闭流浏览器就销毁或者会话结束
response.addCookie(cookie);
System.out.println("CookieServletDemo1");
` 3. cookie能不能存中文 4.
1. 在Tomcat8之后 cookie中可以存放中文数据
2. 之前的使用URL编码就可以了(%E3)
4. cookie获取的范围:
1. 在一个Tomcat服务器中,部署了多个Cookie 默认是不可以被其他web项目共享的
2. Cookie.setPath(path') 在path目录下就可以共享这个Cookie。如果是要共享 cookie.setPath("/") 就可以共享了
3. 不同tomcat服务器之间cookie是可以共享的cookie.setDomain(".baidu.com")// 一级域名相同就可以共享
Cookie的特点
1. cookie存储数据存储在客户端
2. 浏览器对于单个cookie的大小有限制(大约是4kb左右), 同一个域名存取的总数量也有限制(20个左右)
3. 数据不安全,不能存取大量数据,存取不太敏感不重要的数据
4. 在不登录的情况下, 完成服务器对客户端身份证的识别
关于Cookie的案例
1. 记住上一次访问的时间
2. 访问一个servlet 如果是第一次访问 提示:你好,欢迎你首次登陆
3. 如不是的一次登陆, 则提示:欢迎回来,你上次的访问时间是:显示时间字符串:
`package CookieDemo;
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;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author: Lbaci
* @description:
* @createDate: 2019/9/26
*/
@WebServlet("/LoggerServlet")
public class LoggerServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//获取cookie
Cookie[] lastTimes = request.getCookies();
boolean flag= false;
if (lastTimes.length>0&&lastTimes!=null){
for (Cookie cookie : lastTimes) {
String name = cookie.getName();
if ("lastTime".equals(name)){
flag=true;
//有这个cookie 不是第一次访问
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str_data = sdf.format(date);
//发送cookie
System.out.println(str_data);
str_data = URLEncoder.encode(str_data, "utf-8");
System.out.println(str_data);
cookie.setValue(str_data);
//h获取当前时间重新设置cookie 重新发送cookie
response.addCookie(cookie);
//设置cookie的存活时间
cookie.setMaxAge(99999);
String value = cookie.getValue();
System.out.println("解码前"+value);
//解码
value= URLDecoder.decode(value, "utf-8");
response.getWriter().write("</h1>"+"欢迎回来,你上次的访问时间是:"+value+"</h1>");
break;
}
if (lastTimes==null ||lastTimes.length==0|| flag==false){
//没有这个cookie
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
String str_data = sdf.format(date);
//h获取当前时间重新设置cookie 重新发送cookie
//编码:
URLEncoder.encode(str_data,"utf-8");
cookie.setValue(str_data);
Cookie cookie1 = new Cookie("lastTime",str_data);
//设置cookie的存活时间
cookie1.setMaxAge(99999);
//发送cookie
response.addCookie(cookie1);
response.getWriter().write("</h1>"+"你好,欢迎首次访问</h1>");
}
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
} ` |