• Java web Cookie详解(持久化+原理详解+共享问题+设置中文+发送多个Cookie)


    Java web Cookie详解

    啥是cookie?

    查询有道词典得:

    在这里插入图片描述
    在这里插入图片描述

    web和饼干有啥关系?

    在这里插入图片描述
    这个谜底等等来为大家揭晓

    会话技术

    web中的会话技术类似于生活中两个人聊天,不过web中的会话指的是服务器与客户端的交互

    一次会话中包含多次的请求与响应,当浏览器给服务器发送请求时会话建立,直到一方断开时会话结束。
    功能:在一次会话的范围内的多次请求之间,可以共享数据
    这句话是什么意思呢,我用购物车来解释
    在这里插入图片描述

    1.在浏览器中,经常涉及到数据交换,如:你登录一个页面。我们经常会设置自动登录选项。那么它们就是通过cookie来记住我们的信息的, cookie是由HTTP服务器社长子的,保存在浏览器中,但HTTP协议是一种无状态协议,在数据交换完毕后,服务端和客户端的链接就会关闭,每次交换数据都需要建立新的链接。就像我们去超市买东西,没有积分卡的情况下,我们买完东西之后,超市没有我们任何的消费信息,但我们办了积分卡之后,超市就有了我们的消费信息。cookie就像是积分卡,可以保存积分,商品就是我们的信息,超市的系统就像服务器后台,HTTP协议就是交易的过程。

    2.现在上许多网站都用新用户注册这一项,有时注册一下,等到下次在访问该站点时,会自动识别到你,并贴向你问好,是不是觉得很亲切?当然这种作用知识表面现象,更重要的是,网站可以利用Cookie跟踪统计用户访问该网站的习惯,比如什么时间访问,访问了哪些页面,在每个网页的停留时间等。利用这些信息,一方面是可以为用户提供个性化服务,另一方面,也可以作为了解所有用户行为的工具,对于网站经营策略的改进有一定参考价值。例如,你在某家航空公司站点查阅航班时刻表,该站点可能就创建了包含你旅行计划的Cookies,也可能它只记录了你在该站点上曾经访问过的Web页,在你下次访问时,网站根据你的情况对显示的内容进行调整,将你所感兴趣的内容放在前列。这是高级的COokie应用。

    在这里插入图片描述

    cookie的概念

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

    cookie的利弊
    1.将数据保存到客户端,十分方便,同时减轻服务器存储压力
    2.对保存数据的个数(20)及大小有限制(4kb)

    作用
    cookie用来保存少量及不太敏感的数据
    可以在不登入的情况下,对客户端完成身份识别(即在客户端设置一个set-cookie的键值对,在访问的时候使用键值对来获取客户端的身份)

    如何使用Cookie

    我从以下三个步骤来介绍cookie的使用
    1.创建cookie对象
    2.发送cookie对象
    3.获取cookie对象
    由Servlet1设置cookie,Servlet2获取cookie

    Servlet1

    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 Servlet1 extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //创建cookie
            Cookie cookie = new Cookie("name", "zhangsan");
            resp.addCookie(cookie);
        }
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doPost(req, resp);
        }
    }
    

    Servlet2

    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 Servlet2 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //获取cookie
         Cookie[] cookies = req.getCookies();
         if (cookies!=null){
             for (Cookie cookie : cookies) {
                 //获取cookie值与名称
                 String value = cookie.getValue();
                 String name = cookie.getName();
                 System.out.println(name+":"+value);
             }
         }
        }
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doGet(req, resp);
        }
    }
    

    响应cookie
    在这里插入图片描述

    在这里插入图片描述
    请求cookie,另外两个cookie我们这里不做介绍

    在这里插入图片描述

    图解

    在这里插入图片描述

    Cookie的相关问题

    1.如何实现发送多个Cookie
    2.Cookie可以在浏览器中保存多长时间
    3.Cookie如何保存中文
    4.Cookie共享问题

    1.如何实现发送多个Cookie

    使用response对象调用addCookie方法发送cookie即可

    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 Servlet1 extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //创建cookie
            //创建第一个cookie
            Cookie cookie = new Cookie("name", "zhangsan");
            //发送第一个cookie
            resp.addCookie(cookie);
            //创建第二个cookie
            Cookie id = new Cookie("id", "1");
           //发送第二个cookie
            resp.addCookie(id);
        }
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doPost(req, resp);
        }
    }
    
    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 Servlet2 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //获取cookie
         Cookie[] cookies = req.getCookies();
         //遍历cookie数组
         if (cookies!=null){
             for (Cookie cookie : cookies) {
                 //获取cookie值与名称
                 String value = cookie.getValue();
                 String name = cookie.getName();
                 System.out.println(name+":"+value);
             }
         }
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doGet(req, resp);
        }
    }
    

    客户端显示
    在这里插入图片描述IDEA打印
    在这里插入图片描述

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

    默认情况下浏览器关闭后,Cookie数据被销毁
    我们可以调用setmaxage(int seconds)方法来设置Cookie的存储时间
    1.second为正数,将Cookie持久化写入硬盘,并且指定存储的时间,时间到了cookie自动失效
    2.second为零,删除cookie
    3.second小于零,默认值,即浏览器关闭后删除cookie

    3.Cookie如何保存中文

    • 在tomcat 8 之前 cookie中不能直接存储中文数据。
      需要将中文数据转码---一般采用URL编码(%E3)
    • 在tomcat 8 之后,cookie支持中文数据。
      特殊字符还是不支持,建议使用URL编码存储,URL解码解析

    比如我使用以下代码往Cookie中加入数据发送cookie浏览器就会报错,因为往cookie中加入了空格

    Cookie cookie = new Cookie("name", "张  三");
        //发送第一个cookie
        resp.addCookie(cookie);
    

    在这里插入图片描述所以我需要使用url编码来控制数据

    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;
    import java.net.URLDecoder;
    import java.net.URLEncoder;
    
    @WebServlet("/demo1")
    public class Servlet1 extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //设置响应的消息体的数据格式以及编码
           resp.setContentType("text/html;charset=utf-8");
            //创建cookie
            //创建第一个cookie
            String name="张  三";
            //URL编码
            name= URLEncoder.encode(name,"utf-8");
            Cookie cookie = new Cookie("name", name);
            resp.addCookie(cookie);
        }
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doPost(req, resp);
        }
    }
    
    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;
    import java.net.URLDecoder;
    
    @WebServlet("/demo2")
    public class Servlet2 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //获取cookie
         Cookie[] cookies = req.getCookies();
         //遍历cookie数组
         if (cookies!=null){
             for (Cookie cookie : cookies) {
                 //获取cookie值与名称
                 String value = cookie.getValue();
                 String name = cookie.getName();
                 //解码前
                 System.out.println(name+":"+value);
                 //解码后
                 System.out.println(name+":"+ URLDecoder.decode(value,"utf-8"));
             }
         }
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doGet(req, resp);
        }
    }
    

    结果:

    不再报错

    在这里插入图片描述在这里插入图片描述

    4.Cookie共享问题

    1.假设在一个Tomcat服务器中部署了多个web项目,如何实现cookie在这些项目中的共享
    默认情况下是不可以共享的
    但是我们可以调用setpath()方法来设置cookie的获取范围默认情况下,设置当前的虚拟目录 * 如果要共享,则可以将path设置为"/"

     //设置响应的消息体的数据格式以及编码
           resp.setContentType("text/html;charset=utf-8");
            //创建cookie
            //创建第一个cookie
            String name="张   三";
            //URL编码
            name= URLEncoder.encode(name,"utf-8");
            Cookie cookie = new Cookie("name", name);
            //设置path让当前服务器下部署的所有项目共享cookie的信息
            //设置为”/“即可共享
            cookie.setPath("/");
            resp.addCookie(cookie);
    
    1. 不同的tomcat服务器间cookie共享问题? * setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享 * setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享
       //设置响应的消息体的数据格式以及编码
           resp.setContentType("text/html;charset=utf-8");
            //创建cookie
            //创建第一个cookie
            String name="张   三";
            //URL编码
            name= URLEncoder.encode(name,"utf-8");
            Cookie cookie = new Cookie("name", name);
            //设置path让不同的服务器之间可以共享cookie的信息
            //比如设置域名为".baidu.com"的可以共享cookie
           cookie.setDomain(".baidu.com");
            resp.addCookie(cookie);
    

    如有错误还请各位批评指正,写文不易,喜欢的还请点个赞,如有疑问评论留言,我会经常更新文章,看了文章觉得有帮助的可以关注我呀

    在这里插入图片描述

  • 相关阅读:
    zabbix:乱码问题
    zabbix--微信报警(未完成)
    ansible-playbook项目(4)
    ansible-playbook(3)
    备份和校验脚本-邮件通知
    rsync
    keepalived
    双机热备
    nginx负载均衡
    LNMP(5)
  • 原文地址:https://www.cnblogs.com/pjhaymy/p/13434951.html
Copyright © 2020-2023  润新知