24.11.28 Cookie

1.cookie

每次请求时 可以把cookie自定义的数据 传给服务端

(请求参数 请求头之外 报文传自定义数据的位置 cookie可以长期保存)

cookie特点

1.数据格式只有字符串
2.按键值对存储
3.对中文支持较差(尽量不要用中文)
4.按照网站(域 domain)存储    
5.可以长期存储 (有效期)
6.存储好之后 每次访问对应网站时 cookie都会自动发送

2.cookie在浏览器中查看和操作

在浏览器中 用户可以直接操作cookie

cookie一般存储跟用户本身相关的数据 而且是非关键数据

一般不要禁用cookie 禁用之后没法在浏览器缓存数据

3.java中读写cookie

java不能直接操作cookie数据 需要通过报文操作

请求时 浏览器会自动发送存储的cookie数据

响应时 通过Set-cookie响应头 通知浏览器操作cookie

java中与cookie相关API

* 写cookie
   Cookie cookie = new Cookie("ckkey","ckval333");

    设置cookie参数
    //直接设置到根 / 防止出现同名cookie
    cookie.setPath("/");
    //正整数  按秒计算过期时间
    //0      让cookie失效
    //-1     恢复为默认值 关闭浏览器自动失效
    cookie.setMaxAge(-1);

   resp.addCookie(cookie) 响应报文中 set-cookie 让浏览器保存

* 覆盖cookie
   cookie的name(key) path 一样
   可以修改其他参数

* 删除cookie
    cookie.setMaxAge(0); 报文中会传已过期的事件 通知浏览器删除
* cookie读取
        * Cookie[] cookies = req.getCookies();
        * 遍历cookies 读取cookie
        *
* cookie 读+写
        * //新创建的cookie对象 只有key value  其他参数都是默认值
        * Cookie[] cookies = req.getCookies();
        * 如果要覆盖cookie 必须保证同key 同path
        *   if("ckkey".equals(name) ){
                ck.setValue("newvalue");
                ck.setPath("/");
                ck.setMaxAge(60*60*24*30);
                resp.addCookie(ck);
            }

写cookie代码:

package com.javasm.controller;

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;


@WebServlet("/demo1")
public class CookieDemo1 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*
        * 写cookie
        * Cookie cookie = new Cookie("ckkey","ckval333");
        * 设置cookie参数
        * resp.addCookie(cookie) 响应报文中 set-cookie 让浏览器保存
        *
        * 覆盖cookie
        * cookie的name(key) path 一样
        * 可以修改其他参数
        *
        * 删除cookie
        * cookie.setMaxAge(0); 报文中会传已过期的事件 通知浏览器删除
        *
        *
        * */
        System.out.println("demo1运行了............");

        Cookie cookie = new Cookie("ckkey","ckval333");
        //直接设置到根 / 防止出现同名cookie
        cookie.setPath("/");
        //正整数  按秒计算过期时间
        //0      让cookie失效
        //-1     恢复为默认值 关闭浏览器自动失效,不设置值也是
        cookie.setMaxAge(-1);
        //通过响应对象 通知浏览器存储cookie
        //生成响应头 Set-Cookie: ckkey=ckval
        resp.addCookie(cookie);

    }
}

读cookie代码:

package com.javasm.controller;

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;


@WebServlet("/demo2")
public class CookieDemo2 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*
        * 写cookie
        * Cookie cookie = new Cookie("ckkey","ckval333");
        * 设置cookie参数
        * resp.addCookie(cookie) 响应报文中 set-cookie 让浏览器保存
        *
        * 覆盖cookie
        * cookie的name(key) path 一样
        * 可以修改其他参数
        *
        * 删除cookie
        * cookie.setMaxAge(0); 报文中会传已过期的事件 通知浏览器删除
        *
        *
        * cookie读取
        * Cookie[] cookies = req.getCookies();
        * 遍历cookies 读取cookie
        *
        * cookie 读+写
        * //新创建的cookie对象 只有key value  其他参数都是默认值
        * Cookie[] cookies = req.getCookies();
        * 如果要覆盖cookie 必须保证同key 同path
        *   if("ckkey".equals(name) ){
                ck.setValue("newvalue");
                ck.setPath("/");
                ck.setMaxAge(60*60*24*30);
                resp.addCookie(ck);
            }
        *
        *
        * cookie笔试题
        * cookie与session的区别
        *
        * cookie与session的关系
        //同一个浏览器 多次访问时 使用的同一个session对象
        //1session是怎么存的   Map存储 <session编号,session对象>
        //2session怎么识别编号 tomcat会创建一条cookie session编号 让浏览器保存
        //3每次请求时 tocmat读取指定的cookie的key 从而找到浏览器对应的cookie对象
        //session 实现依赖 cookie  通过编号 查找后端的共享数据
        *
        *
        *
        * */
        Cookie[] cookies = req.getCookies();
        for(Cookie ck:cookies){
            //根据当次请求报文 新创建的cookie对象
            String name = ck.getName();
            String value = ck.getValue();
            System.out.println(name+"---"+value);
            if("ckkey".equals(name) ){
                ck.setValue("newvalue");
                ck.setPath("/");
                ck.setMaxAge(60*60*24*30);
                resp.addCookie(ck);
            }
        }
    }
}

4.cookie与session的关系

session依赖cookie 如果禁用cookie session无法使用

package com.javasm.controller;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;


@WebServlet("/cookieSession")
public class CookieAndSession extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        //服务会对浏览器应用 建立对应的session对象
        //同一个浏览器 多次访问时 使用的同一个session对象
        //1session是怎么存的   Map存储 <session编号,session对象>
        //2session怎么识别编号 tomcat会创建一条cookie session编号 让浏览器保存
        //3每次请求时 tocmat读取指定的cookie的key 从而找到浏览器对应的cookie对象
        //session 实现依赖 cookie  通过编号 查找后端的共享数据
        System.out.println(session.getId());


    }
}

5.js中读写cookie

js可以直接操作cookie 如果不向后端传递的情况 可以用作跨页面共享数据

js操作cookieAPI

*  写cookie
    *  document.cookie = 
             "jskey=jsval2;path=/;expires="+new Date('2024/12/15 12:12:12');
*  覆盖cookie
    *  保证同key 同path
*  删除
    *  document.cookie = "jskey=jsval2;path=/;expires="+new Date(过期时间);

*  读取cookie
    *  console.log(document.cookie)
    * ckkey=newvalue; 3333=4444; 4444=55555; ckkey=newvalue
    *
* 读+写
    * document.cookie.split("; ").forEach(data=>{
          //console.log(data);
          let kvarr = data.split("=");
          if("3333" == kvarr[0]){
              let newNum = parseInt(kvarr[1])+1
              document.cookie = `3333=${newNum};path=/;
                                 expires=`+new Date('2024/12/15 12:12:12');
          }
      })
    *
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<input type="button" value="操作cookie" onclick="addCookie()">
<input type="button" value="读取cookie" onclick="readCookie()">
</body>
<script>
  const addCookie = ()=>{
    /*
    *  写cookie
    *  document.cookie = "jskey=jsval2;path=/;expires="+new Date('2024/12/15 12:12:12');
    *  覆盖cookie
    *  保证同key 同path
    *  删除
    *  document.cookie = "jskey=jsval2;path=/;expires="+new Date(过期时间);
    *
    *  读取cookie
    *  console.log(document.cookie)
    * ckkey=newvalue; 3333=4444; 4444=55555; ckkey=newvalue
    *
    * 读+写
    * document.cookie.split("; ").forEach(data=>{
          //console.log(data);
          let kvarr = data.split("=");
          if("3333" == kvarr[0]){
              let newNum = parseInt(kvarr[1])+1
              document.cookie = `3333=${newNum};path=/;expires=`+new Date('2024/12/15 12:12:12');
          }
      })
    *
    *
    * js操作cookie的主要异议
    * 跨页面共享数据 纯前端存储
    *
    *
    * html5 webstorage
    *
    * */


    document.cookie = "jskey=jsval2;path=/;expires="+new Date('2000/12/15 12:12:12');

  }


  const readCookie = ()=>{
      //读到的是字符串
      console.log(document.cookie)
      document.cookie.split("; ").forEach(data=>{
          //console.log(data);
          let kvarr = data.split("=");
          if("3333" == kvarr[0]){
              let newNum = parseInt(kvarr[1])+1
              document.cookie = `3333=${newNum};path=/;expires=`+new Date('2024/12/15 12:12:12');
          }

      })


  }
</script>
</html>

6.webStorage

webStorage在html5版本时 添加的前端共享数据的技术(跨页面共享数据)

两个对象 API操作相同

sessionStorage 会话存储 关闭浏览器自动清除

localStorage 本地存储 长期有效

特征:

* 1.存储键值对
  * 2.数据格式字符串
  * 3.按域存储
  * 4.key唯一

API操作

写
      sessionStorage.新key = '值'
      sessionStorage.setItem('新key','值');

      删除
      sessionStorage.removeItem('key')
      sessionStorage.clear() 全部清除

      读取
      sessionStorage.name              读不到 undefined
      sessionStorage.getItem('addr')   读不到 null

示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<input type="button" value="操作storage" onclick="addstorage()">
<input type="button" value="读取storage" onclick="readstorage()">
</body>
<script>
  /*
  * webStorage  通过js操作 api简单
  *
  *sessionStorage  关闭浏览器自动失效
  *  localStorage  只要不删一直存在
  *
  * 1.存储键值对
  * 2.数据格式字符串
  * 3.按域存储
  * 4.key唯一
  *
  *   浏览器版本有要求 老浏览器用不了 ie8之前
  *   // sessionStorage  关闭浏览器自动删除
      // localStorage    长期有效
      *
      写
      sessionStorage.新key = '值'
      sessionStorage.setItem('新key','值');

      删除
      sessionStorage.removeItem('key')
      sessionStorage.clear() 全部清除

      读取
      sessionStorage.name              读不到 undefined
      sessionStorage.getItem('addr')   读不到 null
  *
  *
  *
  * */



const addstorage = ()=>{
    //属性方式操作
    localStorage.addr='430000';
    // //函数方式操作
    sessionStorage.setItem('name','jack213');

    // localStorage.removeItem('addr');
    // sessionStorage.clear()
    //组合json对象使用
    let myJsonstr = JSON.stringify({name:'jack',age:15,address:'xxxstreet'})
    sessionStorage.setItem('user',myJsonstr)

}

const readstorage  = ()=>{
    console.log(localStorage.getItem('addr'))
    console.log(sessionStorage.name)
    console.log(JSON.parse(sessionStorage.getItem('user')) )//转为JSON格式可以发送到后端
}

</script>
</html>

7.cookie与storage对比

*   cookie  前后端数据交互
  *   纯前端共享数据(跨页面共享数据) api使用麻烦
  *   自动拼入请求报文 向服务端发送
  *
  *   storage  跨页面共享数据
  *   纯前端共享数据(跨页面共享数据) api简单
  *   不自带发送功能 可以手动发送
  *
  *
  *   都可以结合json使用  需要转格式 cookie storage 值都是字符串

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/924819.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

尚硅谷前端 (wsy答辩)

尚硅谷前端 &#xff08;wsy答辩&#xff09; 文章目录 尚硅谷前端 &#xff08;wsy答辩&#xff09;一、前端开发过程和框架1.框架目录结构认识1.程序的入口 有两个 第一个是index,html , 第二个在SRC目录下的main,js2.前端页面环境使用框架&#xff08;模板&#xff09;3、框…

不间断电源 (UPS) 对现代技术可靠性的影响

在这个技术型世界里&#xff0c;无论是在个人还是商业环境中&#xff0c;电力供应商提供的稳定供电都变得越来越重要。 不间断电源 (UPS) 系统是一种不可或缺的解决方案&#xff0c;可保证终端设备不受干扰地运行&#xff0c;在出现电源问题或故障时让用户继续工作。 这篇文章…

【05】Selenium+Python 两种文件上传方式(AutoIt)

上传文件的两种方式 一、input标签上传文件 可以用send_keys方法直接上传文件 示例代码 input标签上传文件import time from selenium import webdriver from chromedriver_py import binary_path # this will get you the path variable from selenium.webdriver.common.by i…

leetcode 二叉树的最大深度

104. 二叉树的最大深度 已解答 简单 相关标签 相关企业 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3…

MATLAB - ROS2 ros2genmsg 生成自定义消息(msg/srv...)

系列文章目录 前言 语法 ros2genmsg(folderpath)ros2genmsg(folderpath,NameValue) 一、说明 ros2genmsg(folderpath) 通过读取指定文件夹路径下的 ROS 2 自定义信息和服务定义来生成 ROS 2 自定义信息。函数文件夹必须包含一个或多个 ROS 2 软件包。这些软件包包含 .msg 文件…

使用 Elastic 和 Apple 的 OpenELM 模型构建 RAG 系统

作者&#xff1a;来自 Elastic Gustavo Llermaly 如何部署和测试新的 Apple 模型并使用 Elastic 构建 RAG 系统。 在本文中&#xff0c;我们将学习部署和测试新的 Apple 模型&#xff0c;并构建一个 RAG 系统来模拟 Apple Intelligence&#xff0c;使用 Elastic 作为向量数据库…

springboot336社区物资交易互助平台pf(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 社区物资交易互助平台设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff…

python爬虫案例——猫眼电影数据抓取之字体解密,多套字体文件解密方法(20)

文章目录 1、任务目标2、网站分析3、代码编写1、任务目标 目标网站:猫眼电影(https://www.maoyan.com/films?showType=2) 要求:抓取该网站下,所有即将上映电影的预约人数,保证能够获取到实时更新的内容;如下: 2、网站分析 进入目标网站,打开开发者模式,经过分析,我…

Flutter 指纹识别

在这篇博客中&#xff0c;我们将介绍如何使用 Flutter 的 local_auth 插件在 Android 和 iOS 设备上实现指纹识别功能。通过这一步一步的实现&#xff0c;我们将学习如何检查设备是否支持生物识别、如何触发指纹验证&#xff0c;并处理可能出现的错误。 效果图&#xff08;因为…

不建模,无代码,如何快速搭建VR虚拟展厅?

不建模、无代码搭建虚拟展厅&#xff0c;可以借助一些专业的虚拟展厅搭建平台或工具来实现。以下是一些具体的步骤和建议&#xff1a; 一、选择平台或工具 首先&#xff0c;需要选择一个适合的平台或工具来搭建虚拟展厅。这些平台通常提供预设的展厅模板、拖拽式编辑工具和丰富…

网络空间安全之一个WH的超前沿全栈技术深入学习之路(13-3)白帽必经之路——如何用Metasploit 渗透到她的心才不会让我释怀

欢迎各位彦祖与热巴畅游本人专栏与博客 你的三连是我最大的动力 以下图片仅代表专栏特色 [点击箭头指向的专栏名即可闪现] 专栏跑道一 ➡️网络空间安全——全栈前沿技术持续深入学习 专栏跑道二 ➡️ 24 Network Security -LJS ​ ​ ​ 专栏跑道三 ➡️ MYSQL REDIS Advan…

深入理解计算机系统,源码到可执行文件翻译过程:预处理、编译,汇编和链接

1.前言 从一个高级语言到可执行程序&#xff0c;要经过预处理、编译&#xff0c;汇编和链接四个过程。大家可以思考下&#xff0c;为什么要有这样的过程&#xff1f; 我们学习计算机之处&#xff0c;就应该了解到&#xff0c;计算机能够识别的只有二进制语言&#xff08;这是…

linux系统清理全部python环境并重装

提问 centos系统清理全部python环境并重装&#xff0c;并且使用宝塔。 解答 要在CentOS系统中彻底清理Python3环境&#xff0c;可以遵循以下步骤&#xff1a; 卸载Python3 使用rpm命令卸载所有与Python3相关的包。这个命令会查询所有已安装的与python3相关的rpm包&#xf…

蓝桥杯——递归

1、用递归实现阶乘 5*4*3*2*1120 package day3;public class Demo6 {public static void main(String[] args) {int result f(5);System.out.println(result);}private static int f(int i) {if(i1) {return 1;}return i * f(i-1);}}结果&#xff1a;120 2、爬楼梯 有一个楼…

DAMODEL丹摩|部署FLUX.1+ComfyUI实战教程

本文仅做测评体验&#xff0c;非广告。 文章目录 1. FLUX.1简介2. 实战2. 1 创建资源2. 1 ComfyUI的部署操作2. 3 部署FLUX.1 3. 测试5. 释放资源4. 结语 1. FLUX.1简介 FLUX.1是由黑森林实验室&#xff08;Black Forest Labs&#xff09;开发的开源AI图像生成模型。它拥有12…

黑马程序员Java项目实战《苍穹外卖》Day02

苍穹外卖-day02 课程内容 新增员工员工分页查询启用禁用员工账号编辑员工导入分类模块功能代码 **功能实现&#xff1a;**员工管理、菜品分类管理。 员工管理效果&#xff1a; 菜品分类管理效果&#xff1a; 1. 新增员工 1.1 需求分析和设计 1.1.1 产品原型 一般在做需求…

《解锁计算机专业宝藏:核心编程语言与学习资料全解析》

在当今数字化浪潮汹涌澎湃、技术迭代日新月异的时代&#xff0c;计算机专业宛如一座蕴藏无尽宝藏与无限机遇的神秘殿堂&#x1f3f0;。对于莘莘学子而言&#xff0c;精准掌握核心编程语言&#xff0c;并手握优质学习资料&#xff0c;恰似寻得开启这扇殿堂大门的秘钥&#xff0c…

【Ubuntu 24.04】How to Install and Use NVM

参考 下载 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash激活 Activate NVM: Once the installation script completes, you need to either close and reopen the terminal or run the following command to use nvm immediately. exp…

【优选算法】位运算

目录 常见位运算总结1、基础位运算2、给一个数n&#xff0c;确定它的二进制位的第x位上是0还是13、将一个数n的二进制位的第x位改成14、将一个数n的二进制位的第x位改成05、位图的思想6、提取一个数n的二进制位中最右侧的17、将一个数n的二进制位中最右侧的1变为08、位运算的优…

systemverilog约束中:=和:/的区别

“x dist { [100:102] : 1, 200 : 2, 300 : 5}” 意味着其值等于100或101或102或200或300其中之一&#xff0c; 其权重比例为1:1:1:2:5 “x dist { [100:102] :/ 1, 200 : 2, 300 : 5}” 意味着等于100&#xff0c;101&#xff0c;102或200&#xff0c;或300其…