Cookie对象

Cookie是浏览器提供的一种技术,通过服务器的程序能将一些只须保留在客户端,或者在客户端进行解决的数据,放在本地的计算机上,不须要通过网络传输,因此进步网页解决的效率,并且可能缩小服务器的负载,然而因为 Cookie 是服务器端保留在客户端的信息, 所以其安全性也是很差的。例如常见的记住明码则能够通过 Cookie 来实现。

有一个专门操作Cookie的类 javax.servlet.http.Cookie。随着服务器端的响应发送给客户端,保留在浏览器。当下次再拜访服务器时把Cookie再带回服务器。

Cookie 的格局:键值对用“=”链接,多个键值对间通过“;”隔开。

Cookie的创立和发送

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

// 创立Cookie对象Cookie cookie = new Cookie("uname","zhangsan");// 发送Cookie对象response.addCookie(cookie);

F12 查看

Cookie的获取

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

// 获取Cookie数组Cookie[] cookies = request.getCookies();// 判断数组是否为空if (cookies != null && cookies.length > 0) {    // 遍历Cookie数组    for (Cookie cookie : cookies){        System.out.println(cookie.getName());        System.out.println(cookie.getValue());    }}

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对象指定工夫后生效

// 创立Cookie对象Cookie cookie = new Cookie("uname","zhangsan");// 设置Cookie 3天后生效cookie.setMaxAge(3 * 24 * 60 * 60);// 发送Cookie对象response.addCookie(cookie);

Cookie的留神点

  1. Cookie保留在以后浏览器中。

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

  2. Cookie存中文问题

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

    String name = "姓名";String value = "张三";// 通过 URLEncoder.encode()来进行编码name = URLEncoder.encode(name);value = URLEncoder.encode(value);// 创立Cookie对象Cookie cookie = new Cookie(name,value);// 发送Cookie对象response.addCookie(cookie);
    // 获取时通过 URLDecoder.decode()来进行解码URLDecoder.decode(cookie.getName());URLDecoder.decode(cookie.getValue());
  3. 同名Cookie问题

    如果服务器端发送反复的Cookie那么会笼罩原有的Cookie。

  4. 浏览器寄存Cookie的数量

    不同的浏览器对Cookie也有限定,Cookie的存储有是下限的。Cookie是存储在客户端(浏览器)的,而且个别是由服务器端创立和设定。前期联合Session来实现回话跟踪。

Cookie的门路

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

情景一:以后服务器下任何我的项目的任意资源都可获取Cookie对象

/* 以后我的项目门路为:s01 */Cookie cookie = new Cookie("xxx","XXX");// 设置门路为"/",示意在以后服务器下任何我的项目都可拜访到Cookie对象cookie.setPath("/");response.addCookie(cookie);

情景二:以后我的项目下的资源可获取Cookie对象 (默认不设置Cookie的path)

/* 以后我的项目门路为:s01 */Cookie cookie = new Cookie("xxx","XXX");// 设置门路为"/s01",示意在以后我的项目下任何我的项目都可拜访到Cookie对象cookie.setPath("/s01"); // 默认状况,可不设置path的值response.addCookie(cookie);

情景三:指定我的项目下的资源可获取Cookie对象

/* 以后我的项目门路为:s01 */Cookie cookie = new Cookie("xxx","XXX");// 设置门路为"/s02",示意在s02我的项目下才可拜访到Cookie对象cookie.setPath("/s02"); // 只能在s02我的项目下获取Cookie,就算cookie是s01产生的,s01也不能获取它response.addCookie(cookie);

情景四:指定目录下的资源可获取Cookie对象

/* 以后我的项目门路为:s01 */Cookie cookie = new Cookie("xxx","XXX");// 设置门路为"/s01/cook",示意在s02/cook目录下才可拜访到Cookie对象cookie.setPath("/s01/cook"); response.addCookie(cookie);

如果咱们设置path,如果以后拜访的门路蕴含了cookie的门路(以后拜访门路在cookie门路根底上要比cookie的范畴小)cookie就会加载到request对象之中。

cookie的门路指的是能够拜访该cookie的顶层目录,该门路的子门路也能够拜访该cookie。

<font color="red">总结:当拜访的门路蕴含了cookie的门路时,则该申请将带上该cookie;如果拜访门路不蕴含cookie门路,则该申请不会携带该cookie。</font>

加VX理解点我扫码支付
学习更多常识,请退出企鹅群:1080355292,入群暗号(33)