Cookie
1、会话
会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话
有状态会话:一个同学来过教师,下次再来教室,我们会知道这个同学,曾经来过,称之为有状态会话
你怎么证明你是xx学校的学生?
你 学校
1、你的学生证 学校给你学生证
2、学校登记 学校标记你来过了
对于网络上,一个网站怎么证明你来过?
你----客户端 学校----服务端
- 服务端给客户端一个 信件✉️,客户端下次访问服务端上的信件就可以了。 信件—cookie
- 服务器登记你来过了,下次你的时候我来匹配你;
无状态会话:打开、关闭
2 保存会话的两种技术
cookie
- cookie是一种客户端技术,cookie相当于那个信件,是服务器发给客户端的,如何发给,服务器通过响应发给客户端,客户端通过请求拿着信件给客户端
session
- session是一种服务器技术,利用这个技术可以保存用户的会话信息,我们可以把信息或者数据放在seesion中
常见场景:网站登陆之后,你下次访问不用再登陆了,第二次访问直接就上去了
Cookie
1、从请求中拿到Cookie信息
2、服务器响应给客户端cookie
Cookie核心方法
Cookie[] cookies = req.getCookies(); //获得Cookie
cookie.getName(); //获得cookie中的key
cookie.getValue(); //获得cookie中的vlaue
new Cookie("lastLoginTime", System.currentTimeMillis()+""); //新建一个cookie
cookie.setMaxAge(24*60*60); //设置cookie的有效期
resp.addCookie(cookie); //响应给客户端一个cookie```
Cookie:一般会保存在本地的用户目录下 appdatay
细节问题
- 一个cookie只能保存一个信息
- 一个web站点可以给浏览器发送多个cookie,浏览器大约300个cookie上限
- 每个站点最多存放20个cookie
- cookie的大小有限制 比如4kb
删除Cookie
- 不设置有效期,关闭浏览器,自动失效
- 另一种方法 创建一个名字相同的cookie,设置其有效期为0
学习完cookie做一个小Demo
利用cookie来显示一个网站的某一个用户上次登陆的时间
CookieDemo01
package com.lding.servlet;
import javax.servlet.ServletException;
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.io.PrintWriter;
import java.util.Date;
/**
* @program: javaweb-session-cookie
* @description:
* @author: 王丁
* @date: 2021-10-28 11:03
**/
//保存用户上一次访问的时间
public class CookieDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//服务器告诉你你来的时间,把这个时间封装成为一个信件
//下次你带这个信件来,服务器就知道是你来来
//解决中文乱码
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setHeader("content-type","text/html;charset=UTF-8");
//
PrintWriter out = resp.getWriter();
//cookie,服务器端从客户端的请求中获取呀
//这里返回的是数组说明Cookie可能存在多个
Cookie[] cookies = req.getCookies();
//判断Cookie是否存在
if(cookies!=null){
//如果存在怎么办
out.write("你上一次访问的时间是:");
for(int i=0;i<cookies.length;i++){
Cookie cookie = cookies[i];
//获取cookie的名字
if(cookie.getName().equals("lastLoginTime")){
//获取cookie中的值
//parseLong 将字符串转化成长整形的时间戳
long lastLoginTime = Long.parseLong(cookie.getValue());
Date date = new Date(lastLoginTime);
out.write(date.toString());
}
}
}else{
out.write("这是您第一次访问本站");
}
//服务器给客户端响应一个cookie
Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
//设置cookie有效期为一天,浏览器关闭后,cookie还存在
cookie.setMaxAge(24*60*60);
System.out.println(System.currentTimeMillis()+"时间");
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
运行效果
每次访问时间后,结果会跟着改变
Cookie的理解
客户端访问服务器,服务器给客户端一个cookie,客户端下次访问,请求时携带着cookie
- 从请求中拿到cookie信息
- 服务器响应给客户端cookie
有时候需要用到编码和解码才能更好的保证不会乱码
URLEncoder.encode("冷丁","utf-8")
URLDecoder.decode(cookie.getValue(),"UTF-8")