Cookie详解

Cookie详解,第1张

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;
​

@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;
​

@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.com和news.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;

@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);
    }
}

 

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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5623961.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存