Cookie对象详解

1.Cookie对象简介

Cookie 是浏览器提供的一种技术,通过服务器的程序能将一些只须保存在客户端,或者在客户端进行处理的数据,放在本地的计算机上,不需要通过网络传输,因而提高网页处理的效率,并且能够减少服务器的负载,但是由于 Cookie 是服务器端保存在客户端的信息,所以其安全性也是很差的。例如常见的记住密码则可以通过Cookie 来实现。 有一个专门操作 Cookie 的类 javax . servlet . http . Cookie 。随着服务器端的响应发送给客户端,保存在浏览器。当下次再访问服务器时把 Cookie 苒带回服务器。 Cookie 的格式:键值对用"="链接,多个键值对间通过";"隔开。

2.Cookie原理

web程序是使用http协议传输的,http协议的特点是无状态,对事物没有记忆功能,缺少状态就意味着如果后续我们需要处理前面的信息的话它必须要重新传入数据,这样会导致每一次连接传送的数据量增大。

Cookie弥补http协议的不足,http协议是无状态的协议,所以服务器单单从网络连接上是无法知道你的客户身份,这样我们应该给客户端颁发身份也就是通行证,任意一个客户端来访问的时候都要携带自己的通行证,这样服务器就能从通行证上获取用户的信息。

3.Cookie的作用

Cookie的作用主要就是,当你去访问某一些网页或者说对网页的设置进行一些修改的时候Cookie就能跟踪并记录你的操作和对网页的一些修改,当你下次再访问这网页的时候,这个网页就会分析你电脑上的Cookie,然后采取一些措施,返回你更想要的结果。

目前大部分的广告推荐就是基于Cookie的,Cookie会记录你的访问行为,通过你的访问行为来向你推送个性化广告。

还有是否让浏览器记住你的密码,当你下一次访问网页时就会自动登录。

Cookie把一写常用的信息保存到本地磁盘中也就是浏览器软件中,符合要用的条件时浏览器会直接调用而不是还需要客户端传参。不需要网络传输直接在磁盘中拿。

4.Cookie的创建和发送

过 new Cookie (" key "," value ");来创建一个 Cookie 对象,要想将 Cookie 随响应发送到客户端,需要先添加到 response 对象中, response . addCookie ( cookie );此时该 cookie 对象则随着响应发送至了客户端。在浏览器上可以看见。

Cookie的构造器

 public Cookie(String name, String value) {
        validation.validate(name);//要求name唯一
        this.name = name;
        this.value = value;
    }

5.Cookie的获取

服务器端只提供了一个 getCookies ()的方法用来获取客户端回传的所有 cookie 组成的一个数组,如果需要获取单个 cookie 则需要通过遍历, getName ()获取 Cookie 的名称, getValue ()获取 Cookie 的值。

6 .Cookie设置到期时间

除了 Cookie 的名称和内容外,我们还需要关心一个信息,到期时间,到期时间用来指定该 cookie 何时失效。默认为当前浏览器关闭即失效。我们可以手动设定 cookie 的有效时间(通过到期时间计算),通过setMaxAge ( int time );方法设定 cookie 的最大有效时间,以秒为单位。

到期时间的取值

·负整数 若为负数,表示不存储该 cookie 。

cookie 的 maxAge 属性的默认值就是﹣1,表示只在浏览器内存中存活,一旦关闭浏览器窗口,那么 cookie 就会消失。

.正整数 若大于0的整数,表示存储的秒数。

表示 cookie 对象可存活指定的秒数。当生命大于0时,浏览器会把 Cookie 保存到硬盘上,就算关闭浏览器,就算重启客户端电脑, cookie 也会存活相应的时间。

.零 若为0,表示删除该 cookie .

cookie 生命等于0是一个特殊的值,它表示 cookie 被作废!也就是说,如果原来浏览器已经保存了这个 Cookie ,那么可以通过 Cookie 的 setMaxAge (0)来删除这个 Cookie 。无论是在浏览器内存中,还是在客户端硬盘上都会删除这个 Cookie 。 设置 Cookie 对象指定时间后失效

7.Cookie的注意点

  1. Cookie保存在当前浏览器中。

    在一般的站点中常常有记住用户名这个操作,该操作只是将信息保存在本机上,换电脑以后这些信息就无效了。而且cookie还不能跨浏览器

  2. Cookie存在中文问题

    Cookie中不能出现中文,如果有中文则通过URlEncode.encode()来进行编码,获取时通过URLDecoder.decode()来进行编码

     3.同名问题如服务器端发送重复的Cookie那么会覆盖原有的Cookie

  3. 4.浏览器存放Cookie的数量不同的浏览器对Cookie也有限定,Cookie的存储是有上限的。Cookie是存储在客户端(浏览器)的而且一般是由服务器端创建和设定的。后期结合Session来实现回话跟踪。

package com.cookie.servlet;

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.URLDecoder;
import java.net.URLEncoder;

/**
 * Cookie的注意点
 * 1.Cookie只在当前浏览器中有效
 * 2.Cookie不能存中文:
 * 如果一定要存中文,则需要URlEncode.encode()这个方法进行编码
 * 获取时通过URLDecoder.decode()进行解码
 * 3.如果出现同名的cookie对象则会覆盖
 * 4.cookie的存储数量是有上线的,不同浏览器的上限不同,cookie存储的大小是有限的大小为4kb
 *
 */
@WebServlet("/c04")
public class Cookie04 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //Cookie存中文问题
        String name="name";
        String value="赵宇晖";
        //将中文通过URLEncoder
        name= URLEncoder.encode(name);
        value=URLEncoder.encode(value);
        //创建Cookie对象
        Cookie cookie=new Cookie(name,value);
        //响应Cookie
        response.addCookie(cookie);
        //获取Cookie时通过URLDecoder进行解码
        Cookie[] cookies=request.getCookies();
        //判断非空
       if (cookies!=null&&cookies.length>0){
            for (Cookie cook:cookies
                 ) {
                //解码
                System.out.println(URLDecoder.decode(cook.getName()));
                System.out.println(URLDecoder.decode(cook.getValue()));
            }
        }



    }
}

8.Cookie的路径问题

Cookie的setPath设置Cookie的路径,这个路径直接决定服务器的请求是否会从浏览器中加载某些cookie

 在A项目中设置的Cookie在B项目中正常情况下是拿不到的

如果我们设置path,如果当前访问的路径包含了cookie的路径(当前访问路径在cookie路径基础上要比cookie范围小)cookie就会加载到request对象之中

cookie的路径指的是可以访问该cookie的顶层目录,该路径的子路径也可以访问cookie

总结:当访问的路径包含了cookie的路径时,则该请求将带上该cookie;如果访问路径不包

含cookie路径

package com.cookie.servlet;

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.URLDecoder;
import java.net.URLEncoder;

/**
 * Cookie路径问题
 * 1./
 */
@WebServlet("/c05")
public class Cookie05 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //当前项目下任何项目的任意资源都可以获取Cookie对象
        Cookie cookie01=new Cookie("cookie01","cookie01");
        //设置路径为/表示当前路径下任意项目都能访问到cookie对象
        cookie01.setPath("/");
        response.addCookie(cookie01);

        //默认的当前项目下可以获取Cookie对象(默认不设置cookie的path)
        //或者设置为当前站点名
        Cookie cookie02=new Cookie("cookie02","cookie02");
        cookie02.setPath("/zyh2");
        response.addCookie(cookie02);

        //指定项目下的资源可获取Cookie对象
        Cookie cookie03=new Cookie("cookie03","cookie03");
        //设置指定站点名
        cookie03.setPath("/zyh");
        response.addCookie(cookie03);

        //指定目录下的资源可获取Cookie对象;
        Cookie cookie04=new Cookie("cookie04","cookie04");
        cookie04.setPath("/zyh2/c02");
        response.addCookie(cookie04);




    }
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

外太空的莫扎特

在校生穷逼一个,呜呜呜

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值