• 对Cookie运用的实战与原理剖析详解


    一.Javaweb Cookie

    1.1 会话

    用户打开浏览器,单击多个超链接,访问多个web资源,然后关闭浏览器的过程叫做会话。

    1.2 Cookie和Session的区别

    Cookie:服务端给了客户端一个标头,客户端下次访问带上标头即可,在本地保存。

    Session:服务器登记本机访问记录,下次访问服务器匹配数据库数据。

    1.3 保存会话的俩种技术

    Cookie

    • 客户端的技术,主要有响应和请求

    Session

    • 服务器端的技术,利用这个技术,可以保存用户的会话记录。
    • 可以把信息和数据保存在session里。

    二.对于Cookie记录实战

    1.新建立maven工程,工程名为:servlet-session-chookie。

    2.新建java目录为,存放项目的目录路径。

    3.新建接口,接口名为:com.gowork.servlet。

    4.在com.gowork.servlet接口下新建类,类名为CookieDemo1。

    5.继承类HttpServlet,重写doGet方法,doPost指向doGet。

    6.提前设置编码类型,请求和我响应:

    req.setCharacterEncoding("utf-8");
    resp.setCharacterEncoding("utf-8");
    
    • 1
    • 2

    7.chookie服务端想客户端获取。

    Cookie[] cookies = req.getCookies();
    
    • 1

    8.服务器每次访问,获取一次时间存储。

    Cookie cookie = new Cookie("lasttime", System.currentTimeMillis() + "");
    resp.addCookie(cookie);
    
    • 1
    • 2

    9.如果第7步的cookies不为空的话。输出上一次访问的时间的提示语句。

    遍历cookies,获取cookies名称为低8步骤的lasttime的值,进行响应个前端。

    for(int i=0;i < cookies.length; i++){
        Cookie cookie = cookies[i];
        if(cookie.getName().equals("lasttime") ){
            cookie.getValue();
            long l = Long.parseLong(cookie.getValue());
            Date date = new Date(l);
            out.write(date.toLocaleString());
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    10.如果第8步的cookies为空的话,输出:第一次访问。

    并且下面的cookie继续执行,获取到当前时间存储到用户本地的chooice里,名称为“:lasttime,看上面的第八步。

    11.配置注册url,写url的映射。

      <servlet>
        <servlet-name>cookieservlet-name>
        <servlet-class>com.gowork.servlet.CookieDemo1servlet-class>
      servlet>
      <servlet-mapping>
        <servlet-name>cookieservlet-name>
        <url-pattern>/co5url-pattern>
      servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    12.设置tomact的访问路径。

    C:\Users\24190\IdeaProjects\xiao\servletr-session-chookie\src\main\webapp

    13.启动tomact服务器。访问路径:

    localhost:8080/servletr-session-chookie/co5

    14.访问效果图如下:

    第一次访问:

    image-20220822103312331

    多次访问;

    image-20220822103341427

    15.设置cookie的有效期:

    cookie.setMaxAge(24*60*60);
    
    • 1

    运行项目,打开F12,查看网络,发现有效期为一天。

    Set-Cookie: lasttime=1661136845468; Max-Age=86400; Expires=Tue, 23-Aug-2022 02:54:05 GM
    
    • 1

    2.1 cookie常用合集

    获取cookie:

     Cookie[] cookies = req.getCookies();
    
    • 1

    获取cookie的key和value:

    cookie.getName()
    cookie.getValue()
    
    • 1
    • 2

    新建一个cookie:

    Cookie cookie = new Cookie("lasttime", System.currentTimeMillis() + "");
    
    • 1

    设置cookie的有效期:

    cookie.setMaxAge(24*60*60)
    
    • 1

    响应个客户端一个cookie:

    resp.addCookie(cookie);
    
    • 1

    2.2 细节问题

    • 一个cookie只能保存一条信息;
    • 一个网站可以向浏览器发送多个cookie,并最多存储20个cookie;
    • Cookie大小限制为4KB;
    • 300个Cookie浏览器限制;

    删除cookie:

    • 不设置有效期,关闭浏览器,自动失效
    • 设置有效期,超出有效期,cookie失效
    • 设置有效期时间为0

    2.3 删除一个cookie

    1.创建一个cookie的类,类名为:CookieDemo2

    2.继承HttpServlet,重写doGet方法,doPost方法指向于doGet。

    3.创建一个cookie,名称要与被删除的cookie相同。

    Cookie cookie = new Cookie("lasttime", System.currentTimeMillis() + "");
    
    • 1

    4.设置cookie的有效期为0:

    cookie.setMaxAge(0);
    
    • 1

    5.响应回客户端。

    resp.addCookie(cookie);
    
    • 1

    6.注册url,写映射:

      <servlet>
        <servlet-name>cookie02servlet-name>
        <servlet-class>com.gowork.servlet.CookieDemo2servlet-class>
      servlet>
      <servlet-mapping>
        <servlet-name>cookie02servlet-name>
        <url-pattern>/co2url-pattern>
      servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    7.启动web容器,访问url观察:

    第二次访问:co5:

    image-20220822113444705

    访问co2,删除cookie:

    image-20220822113514987

    再次访问co5:

    image-20220822113531642

    结果发现cookie被删除,变为第一次访问!

    2.4 编码解码

    在前后端传输过程请中,对中文传输容易造成乱码问题。这里用到网络编程的知识点,编码与解码:

    编码:

    Cookie cookie = new Cookie("name", URLEncoder.encode("菜猪", StandardCharsets.UTF_8));
    
    • 1

    解码:

    out.write(URLDecoder.decode(cookie.getValue(), StandardCharsets.UTF_8));
    
    • 1

    编码解码效果成功图如下:

    image-20220822145308802

    这样传输更加安全,有效的避免了中文乱码问题。

  • 相关阅读:
    最短路题单练习
    二十九、java版 SpringCloud分布式微服务云架构之Java 数据结构
    Linux查看日志比较实用的几个命令
    华为OD技术面试-最短距离矩阵(动态规划、广度优先)
    [源码解析] TensorFlow 分布式之 ParameterServerStrategy V1
    CMAC(GBT 15852.1)和OMAC(RFC4493/NIST SP800-38B)的java实现和测试
    2022河南萌新联赛第(七)场:南阳理工学院 B - 龍
    如何查看 class 文件的编译器版本
    【笔试题】【day18】
    vector的模拟实现
  • 原文地址:https://blog.csdn.net/weixin_52908342/article/details/126466164