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的构造器
1
2
3
4
5public 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的注意点
-
Cookie保存在当前浏览器中。
在一般的站点中常常有记住用户名这个操作,该操作只是将信息保存在本机上,换电脑以后这些信息就无效了。而且cookie还不能跨浏览器
-
Cookie存在中文问题
Cookie中不能出现中文,如果有中文则通过URlEncode.encode()来进行编码,获取时通过URLDecoder.decode()来进行编码
3.同名问题如服务器端发送重复的Cookie那么会覆盖原有的Cookie
-
4.浏览器存放Cookie的数量不同的浏览器对Cookie也有限定,Cookie的存储是有上限的。Cookie是存储在客户端(浏览器)的而且一般是由服务器端创建和设定的。后期结合Session来实现回话跟踪。
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54package 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路径
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50package 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); } }
最后
以上就是悦耳黄蜂最近收集整理的关于Cookie对象详解的全部内容,更多相关Cookie对象详解内容请搜索靠谱客的其他文章。
发表评论 取消回复