IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Cookie详解 -> 正文阅读

[网络协议]Cookie详解

目录

一 会话技术

概念

1.1 会话

1.2 一次会话

1.3 功能

1.4 例子

1.5 方式

二 Cookie

2.1 概念

2.2 快速入门

1.创建Cookie对象 绑定数据

2.发送Cookie对象

3.获取Cookie 拿到数据

2.3 原理分析

2.4 Cookie的细节

1.一次可不可以发送多个Cookie?

2.Cookie在浏览器中保存多长时间?

3.Cookie能不能存中文

4.Cookie共享问题;

5.Cookie的特点和作用

6.Cookie案例


一 会话技术

概念

1.1 会话

一次会话中包含多次请求和响应

1.2 一次会话

浏览器第一次给服务器资源发送请求 会话建立 直到有一方断开为止

1.3 功能

在一次会话的范围内 共享数据 一次会话中包含多次请求-响应 会话技术 可以在多次请求响应间共享数据

1.4 例子

比如购物车一次结算多种商品 每次选择一种商品都是一次请求-响应 多次选择后 一次结算 在多次请求响应之间共享价格等数据

1.5 方式

客户端会话技术 Cookie 数据存储客户端

服务端会话技术:Session数据存储服务器端

二 Cookie

2.1 概念

客户端会话技术 将数据保存到客户端

2.2 快速入门

1.创建Cookie对象 绑定数据

2.发送Cookie对象

3.获取Cookie 拿到数据

CookieDemo1

package Cookie;
?
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
?
import java.io.IOException;
?
/**
 * @author shijiu
 */
@WebServlet("/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
 ? ?@Override
 ? ?protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 ? ? ? ?//1.创建cookie对象
 ? ? ? ?Cookie c = new Cookie("msg","hello");
 ? ? ? ?//2.发送cookie给浏览器
 ? ? ? ?resp.addCookie(c);
 ?  }
 ? ?@Override
 ? ?protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 ? ? ? ?doPost(req, resp);
 ?  }
}

CookieDemo2

package Cookie;
?
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
?
import java.io.IOException;
?
/**
 * @author shijiu
 */
@WebServlet("/CookieDemo2")
public class CookieDemo2 extends HttpServlet {
 ? ?@Override
 ? ?protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 ? ? ? //3.获取cookie
 ? ? ? ?Cookie[] cookies = req.getCookies();
 ? ? ? ?//遍历
 ? ? ? ?if(cookies!=null){
 ? ? ? ? ? ?for (Cookie c:cookies){
 ? ? ? ? ? ? ? ?String name = c.getName();
 ? ? ? ? ? ? ? ?String value = c.getValue();
 ? ? ? ? ? ? ? ?System.out.println(name+":"+value);//msg:hello
 ? ? ? ? ?  }
 ? ? ?  }
 ?  }
 ? ?@Override
 ? ?protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 ? ? ? ?doPost(req, resp);
 ?  }
}

2.3 原理分析

客户端浏览器第一次发送请求 请求CookieDemo1的资源? CookieDemo1发送Cookie给浏览器 (真实发送了一个响应头set-cookie:msg=hello)

浏览器会将cookie保存 下一次发送请求时 cookie会被带过去请求头

我们可以通过java的 api来获取发送cookie

2.4 Cookie的细节

1.一次可不可以发送多个Cookie?

可以

//1.创建cookie对象
Cookie c = new Cookie("msg","hello");
Cookie c1 = new Cookie("msg1","hi");
//2.发送cookie给浏览器
resp.addCookie(c);
resp.addCookie(c1);

2.Cookie在浏览器中保存多长时间

  1. 默认情况下 当浏览器被关闭后 Cookie数据被销毁

  2. 持久化存储 setMaxAge(int time)

    1. 正数 将Cookie数据写到硬盘的文件中 持久化存储 Cookie存活时间 如果time=30 说明30s后cookie会被自动删除

    2. 负数 默认值 浏览器内存中 浏览器关闭就没了

    3. :代表删除cookie信息

3.Cookie能不能存中文

  1. tomcat8之前?Cookie中不能存储中文数据

  2. tomcat8之后?Cookie可以存储中文数据 建议使用url编码存储 使用url解码解析 特殊字符 空格等

Cookie c = new Cookie("msg","爱你");

4.Cookie共享问题;

一 同一个服务器中

假设在一个服务器中部署了多个web项目 那么在这些web项目中cookie能不能共享

项目/15 项目 /16 cookie由/16发出存储 /15能不能获取到cookie信息呢 ?

默认访问不到的 不能共享

setPath(String path)?

设置cookie获取的范围 默认情况下 会去设置当前的虚拟目录

如果要共享

c.setPath("/");

二 不同的服务器中

setDomain(String path)

如果设置一级域名相同 那么多个服务器之间cookie可以共享

例子

setDomain(".baidu.com")

那么tieba.baidu.comnews.baidu.com cookie可以共享

5.Cookie的特点和作用

特点

  • Cookie存储数据在客户端浏览器

  • 浏览器对于单个cookie的大小有限制(4kb) 以及 对同一个域名Cookie的数量也有限制?一般最多20个

作用

  • Cookie一般用于存储少量的不太敏感的数据

  • 在不登录的情况下 完成服务器端对客户端的身份识别

在不登录的情况下 修改一些属性 服务器可以通过cookie达到一种识别效果

6.Cookie案例

记住上一次访问时间

需求

  • 访问一个Servlet 如果是第一次访问 则提示 您好 欢迎您首次访问

  • 如果不是第一次访问 则提示 欢迎回来 您上次访问时间为 xxx

Code

package Cookie;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
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.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * @author shijiu
 */
@WebServlet("/CookieTest")
public class CookieTest extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置响应的消息体的数据格式编码
        //服务器默认为ISO编码 浏览器默认解析用GBK编码 所以会乱码
        //设置成utf-8后就相当于告诉浏览器我用的是什么编码 你应该用相同的编码解析 就可以避免乱码
        resp.setContentType("text/html;charset=utf-8");
        //获取所有cookie
        Cookie[] cookies = req.getCookies();
        boolean flag = false;
        // 遍历所有cookie
        if(cookies!= null&&cookies.length>0){
            for (Cookie cookie:cookies) {
                //获取cookie的名称
                String name = cookie.getName();
                //判断名称是否为lastname
                if ("lasttime".equals(name)){
                    flag=true;
                    //如果if判断为true 则不是第一次访问
                    //响应数据
                    String value = cookie.getValue();
                    //打印到屏幕上
                    resp.getWriter().write("欢迎回来您上次的访问时间为"+value);
                    //获取当前时间
                    Date date = new Date();
                    //格式转换成中国时间格式
                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
                    String format = simpleDateFormat.format(date);
                    //更新cookie的数据
                    cookie.setValue(format);
                    //返回cookie
                    resp.addCookie(cookie);
                    //设置cookie的存活时间
                    cookie.setMaxAge(60 * 60);

                    break;
                }

            }
        }
        if(cookies==null||cookies.length==0||flag==false){
            System.out.println("第一次访问");
            //第一次访问
            //时间
            Date date = new Date();
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
            String format = simpleDateFormat.format(date);
            //创建新cookie
            Cookie lastname = new Cookie("lasttime", format);
            //设置生命周期
            lastname.setMaxAge(100000000);
            //添加cookie
            resp.addCookie(lastname);
            //打印在浏览器上
            resp.getWriter().write("欢迎您首次登陆");
        }

    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}

?

人生总有不期而遇的温暖和生生不息的希望。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-11-30 15:58:44  更:2021-11-30 15:59:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年7日历 -2024/7/6 7:49:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码