5.6 Cookie 讲解
首先我们要了解一下什么是 会话
会话:用户打开一个浏览器,点击了很多的超链接,可以访问多个 web 资源。关闭浏览器,整个过程 就可以称之为 会话
。
有状态会话:一个同学来过教室,下次再来教室的时候,我们一下子就知道该学生曾经来过!这就是 状态的会话。
- 举例:
你能怎么证明 你是 ABC 的学生?
- 你拥有 ABC 的学生证(学生证 肯定是学校发给你的)
- ABC 学校 有 你的 记录(学校标记你是它的学生)
一个 网站,怎么证明你来过了 ?
- 客户端 拥有 服务端发送 的 cookie(小饼干),所以客户端在进行下次访问的时候,直接拿着 cookie 就完事了,就能证明 你已经访问过该网站了。
- 服务器登记一下,记录 你已经来过了。(seesion)
5.6.1 保存会话的两种技术
cookie
- 客户端技术(如果第一次访问,肯定服务器就要发送相应的cookie,第二次访问 客户端拿着 cookie 去访问。)
session
- 服务器技术(利用这个技术,可以保存用户的会话信息,我们可以把信息或者数据放在 Session 中。)
常见的应用:网站登录之后,你下次不用再登录了,第二次访问直接就上去了。
- 解决乱码问题
//解决中文乱码
resp.setContentType("text/html");
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
- 从客户端获取cookies
PrintWriter writer = resp.getWriter();
//cookie,服务器端从客户端获取。
Cookie[] cookies = req.getCookies();
- 判断 cookies 是否存在
//判断 cookies 是否 存在
if(cookies != null)
{
//如果存在的话
writer.write("上一次访问的时间是:");
for(int i = 0;i < cookies.length;++i)
{
Cookie cookie = cookies[i];
//获取 cookie 的名字
//把 "lastLoginTime" 字符串写在前面,为了防止 cookie 空指针问题
if("lastLoginTime".equals(cookie.getName())){
//获取cookie 中的值
long lastLoginTime = Long.parseLong(cookie.getValue());
Date date = new Date(lastLoginTime);
writer.write(date.toLocaleString());
}
}
}else{
writer.write("这是您第一次访问本站!");
}
- 如果不存在,则生成一个cookie 服务器响应到 客户端
//服务器 给 客户端 响应一个cookie
Cookie cookieA = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
resp.addCookie(cookieA);
- 设置 cookie 有效期
//设置 cookieA 的有效期为 60 秒
cookieA.setMaxAge(60);
说明 到 3 点 27 分 38 的时候 cookie 就失效了。那么 页面就不会再显示 时间。
这就是 我们 cookie 的一个 简单的应用。
5.6.2 Cookie 细节问题
一个 网站 cookie 是否存在上限
- 一个 Cookie 只能保存一个信息
- 一个 web 站点 可以给浏览器 发送 多个 cookie,大约 300 个 cookie,而每个 站点 大概 为 20 个 cookie。
- Cookie 大小限制 为 4 kb
- 300 个 cookie 一般是 浏览器的上限
删除 cookie
- 不设置有效期,关闭 浏览器,自动会失效。
- 设置有效期,时间一到自然 就删除了。
- 创建一个 cookie 名一样的 cookie 然后再设置 cookie 有效期为0 就 会直接 干掉 cookie。
package com.muquanyu.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class 删除cookie extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
req.setCharacterEncoding("utf-8");
Cookie[] cookies = req.getCookies();
if(cookies!=null){
for(int i = 0;i < cookies.length;++i){
if("lastLoginTime".equals(cookies[i].getName())){
Cookie lastLoginTime = new Cookie("lastLoginTime", "");
lastLoginTime.setMaxAge(0);
resp.getWriter().write("删除cookie成功!请进行查看!");
return;
}
}
resp.getWriter().write("没有cookie需要删除");
}
//super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doPost(req, resp);
}
}
中文的cookie值
package com.muquanyu.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
public class 中文的cookie值 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
Cookie[] cookies = req.getCookies();
if(cookies!=null)
{
resp.getWriter().write("名字:");
for(int i = 0;i < cookies.length;++i)
if("name".equals(cookies[i].getName())){
//解码
resp.getWriter().write(URLDecoder.decode(cookies[i].getValue(), "utf-8"));
}
}else{
resp.getWriter().write("这是您第一次访问本站");
}
//编码
Cookie cookie = new Cookie("name", URLEncoder.encode("哞哞", "utf-8"));
resp.addCookie(cookie);
//super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doPost(req, resp);
}
}