• Cookie的使用细节


    Cookie使用细节 (1.cookie存活时间 2.cookie如何存储中文)

    1.Cookie存活时间

    • 浏览器发送请求给AServlet,AServlet会响应一个存有usernanme=zs的Cookie对象给浏览器
    • 浏览器接收到响应数据将cookie存入到浏览器内存中
    • 当浏览器再次发送请求给BServlet,BServlet就可以使用Request对象获取到Cookie数据
    • 在发送请求到BServlet之前,如果把浏览器关闭再打开进行访问,BServlet能否获取到Cookie数据?
      == 注意:浏览器关闭再打开不是指打开一个新的选项卡,而是必须先关闭应用程序,再打开,顺序不能变==

    ==针对上面的问题,通过演示会发现,BServlet中无法再无法获取到Cookie数据,这是为啥?

    • 默认情况下。Cookie存储在浏览器内存中,当浏览器关闭时,内存释放,则Cookie被销毁。
      一定要明白cookie存储在浏览器内存中的,关闭浏览器cookie可能会被销毁。为啥是可能,因为后面我们会将到cookie的存活时间,也就是说我们可以设置cookie的存活时间
      如果我们在登录一个网页时选了记住密码我们如何解决Cookie持久化的存储?
      cookie其实已经为我们提供好了对应的API来完成这件事,这个API就是setMaxAge
    • 设置Cookie存活时间
    setMaxAge(int seconds);
    
    • 1

    参数值为:
    1.正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除
    2.负数:默认值,Cookie在当前浏览器关闭,则浏览器关闭,则Cookie被销毁
    3.零:删除对应的Cookie

    接下来,就设置AServlet中去设置Cookie的存活时间。

    @WebServlet("/aServlet")
    public class AServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //发送Cookie
            //1. 创建Cookie对象
            Cookie cookie = new Cookie("username","zs");
            //设置存活时间   ,1周 7天
            cookie.setMaxAge(60*60*24*7); //易阅读,需程序计算
    		//cookie.setMaxAge(604800); //不易阅读(可以使用注解弥补),程序少进行一次计算
            //2. 发送Cookie,response
            response.addCookie(cookie);
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doGet(request, response);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    Cookie存储中文

    首先,先来演示一个效果,将之前username=zhangsan的值改为username=张三,把汉字张三存入到Cookie中,看是什么效果:

    @WebServlet("/aServlet")
    public class AServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     		//发送Cookie
            String value = "张三";
            Cookie cookie = new Cookie("username",value);
            //设置存活时间   ,1周 7天
            cookie.setMaxAge(60*60*24*7);
            //2. 发送Cookie,response
            response.addCookie(cookie);
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doGet(request, response);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    启动访问测试,访问http://localhost:8080/cookie-demo/aServlet会发现浏览器会提示错误信息
    在这里插入图片描述
    通过上面的案例演示,我们得到一个结论:

    • Cookie不能直接存储中文
      Cookie不能存储中文,但是如果有这方面的需求,这个时候如何解决?
      这里需要用到我们之前学过的知识点URL编码,如果要存储中文,就需要进行转码,具体的实现思路为:
    1. 在AServlet中对中文进行URL编码,采用URLEncode.encode(),将编码后的值存入Cookie中
    2. 在BServlet中获取Cookie中的值,获取的值为URL编码后的值
    3. 将获取的值在进行URL解码,采用URLDecode.decode(),就可以获取到对应的中文值
      (1)在AServlet中对中文进行URL编码
    @WebServlet("/aServlet")
    public class AServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //发送Cookie
            String value = "张三";
            //对中文进行URL编码
            value = URLEncoder.encode(value, "UTF-8");
            System.out.println("存储数据:"+value);
            //将编码后的值存入Cookie中
            Cookie cookie = new Cookie("username",value);
            //设置存活时间   ,1周 7天
            cookie.setMaxAge(60*60*24*7);
            //2. 发送Cookie,response
            response.addCookie(cookie);
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doGet(request, response);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    (2)在BServlet中获取值,并对值进行解码

    @WebServlet("/bServlet")
    public class BServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //获取Cookie
            //1. 获取Cookie数组
            Cookie[] cookies = request.getCookies();
            //2. 遍历数组
            for (Cookie cookie : cookies) {
                //3. 获取数据
                String name = cookie.getName();
                if("username".equals(name)){
                    String value = cookie.getValue();//获取的是URL编码后的值 %E5%BC%A0%E4%B8%89
                    //URL解码
                    value = URLDecoder.decode(value,"UTF-8");
                    System.out.println(name+":"+value);//value解码后为 张三
                    break;
                }
            }
    
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doGet(request, response);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    这样我们就可以将中文存入Cookie中进行使用。

    小结
    Cookie的使用细节中,我们要注意cookie的存活时间和存储中文

    • 存活时间,需要掌握setMaxAage() API的使用
    • 存储中文,需要掌握URL编码和解码的使用
  • 相关阅读:
    Istio微服务治理网格流量管理核心资源控制器详解
    学python的第十八天
    99%必用git指令
    计算机网络
    TDengine 3.0 重磅发布,首届开发者大会圆满结束
    【Spring Bean的生命周期】
    【2023,学点儿新Java-11】基础案例练习:输出个人基础信息、输出心形 | Java中 制表符\t 和 换行符\n 的简单练习
    基于JAVA宿舍管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    【21天算法挑战赛】排序算法——希尔排序
    3d数字化虚拟交互展示加深消费者对品牌的认知兴趣度和粘稠度
  • 原文地址:https://blog.csdn.net/qq_53037676/article/details/126566614