JavaWeb 14 Cookie 讲解

5.6 Cookie 讲解


首先我们要了解一下什么是 会话

会话:用户打开一个浏览器,点击了很多的超链接,可以访问多个 web 资源。关闭浏览器,整个过程 就可以称之为 会话

有状态会话:一个同学来过教室,下次再来教室的时候,我们一下子就知道该学生曾经来过!这就是 状态的会话。

  • 举例

你能怎么证明 你是 ABC 的学生?

  1. 你拥有 ABC 的学生证(学生证 肯定是学校发给你的
  2. ABC 学校 有 你的 记录(学校标记你是它的学生)

一个 网站,怎么证明你来过了 ?

  1. 客户端 拥有 服务端发送 的 cookie(小饼干),所以客户端在进行下次访问的时候,直接拿着 cookie 就完事了,就能证明 你已经访问过该网站了。
  2. 服务器登记一下,记录 你已经来过了。(seesion)

5.6.1 保存会话的两种技术

cookie

  • 客户端技术(如果第一次访问,肯定服务器就要发送相应的cookie,第二次访问 客户端拿着 cookie 去访问。)

session

  • 服务器技术(利用这个技术,可以保存用户的会话信息,我们可以把信息或者数据放在 Session 中。)

常见的应用:网站登录之后,你下次不用再登录了,第二次访问直接就上去了。

  1. 解决乱码问题
 //解决中文乱码
        resp.setContentType("text/html");
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
  1. 从客户端获取cookies
PrintWriter writer = resp.getWriter();
        
        //cookie,服务器端从客户端获取。
        Cookie[] cookies = req.getCookies();
  1. 判断 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("这是您第一次访问本站!");
        }
  1. 如果不存在,则生成一个cookie 服务器响应到 客户端
//服务器 给 客户端 响应一个cookie
        Cookie cookieA = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
        resp.addCookie(cookieA);
  1. 设置 cookie 有效期
        //设置 cookieA 的有效期为 60 秒
        cookieA.setMaxAge(60);

在这里插入图片描述
说明 到 3 点 27 分 38 的时候 cookie 就失效了。那么 页面就不会再显示 时间。
在这里插入图片描述

在这里插入图片描述
这就是 我们 cookie 的一个 简单的应用。


5.6.2 Cookie 细节问题

一个 网站 cookie 是否存在上限

  1. 一个 Cookie 只能保存一个信息
  2. 一个 web 站点 可以给浏览器 发送 多个 cookie,大约 300 个 cookie,而每个 站点 大概 为 20 个 cookie。
  3. Cookie 大小限制 为 4 kb
  4. 300 个 cookie 一般是 浏览器的上限

删除 cookie

  1. 不设置有效期,关闭 浏览器,自动会失效。
  2. 设置有效期,时间一到自然 就删除了。
  3. 创建一个 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);
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值