Javaweb之cookie详解
Javaweb之cookie详解
1. Cookie
1.1. Cookie概述
Cookie译为⼩型⽂本⽂件或⼩甜饼,Web应⽤程序利⽤Cookie在客户端缓存服务器端⽂件。Cookie是以键值对形式存储在客户端主机硬盘中,由服务器端发送给客户端,客户端再下⼀次访问服务器端时,服务器端可以获取到客户端Cookie缓存⽂件。
Cookie是由服务器端创建的,然后由服务器端发送给客户端,客户端以键值对形式存储Cookie,并标注Cookie的来源。客户端再次访问服务器端时,存储的Cookie会保存在请求协议中,服务器端可以获取上次存储的缓存⽂件内容。
java技术介绍百度百科Cookie的⽤途:
管理浏览⽹站的⼈数(其中包含有多少⼈访问过,多少⼈是新⽤户等)
电⼦商城中购物车功能(每买⼀样商品,保存⼀个Cookie)
⽤户⾃动登录功能(第⼀次登录时,将⽤户名和密码存储在Cookie)
Cookie的缺点:
多⼈共⽤⼀台计算机(例如导致⽤户名和密码不安全等问题)。
Cookie被删除时,利⽤Cookie统计⽤户数量出现偏差。
⼀⼈使⽤多台计算机(⽹站会将看成多个⽤户等问题)
Cookie会被附加在每次Http请求协议中,增加流量。
Cookie使⽤明⽂(未加密)传递的,安全性低。
Cookie的⼤⼩限制在4KB左右,⽆法存储复杂需求。
1.2. 百度百科
Cookie中⽂名称为⼩型⽂本⽂件,指某些⽹站为了辨别⽤户⾝份⽽储存在⽤户本地终端(Client Side)上的数据(通常经过加密)。定义于RFC2109。为⽹景公司的前雇员Lou Montulli在1993年3⽉所发明。
Cookie⼀词⽤在程序设计中是⼀种能够让⽹站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据的⼀种技术。从本质上讲,它可以看作是你的⾝份证。保存的信息⽚断以"名/值"对(name-value pairs)的形式储存,⼀个"名/值"对仅仅是⼀条命名的数据。
⼀个⽹站只能取得它放在你的电脑中的信息,它⽆法从其它的Cookie⽂件中取得信息,也⽆法得到你的电脑上的其它任何东西。 Cookie中的内容⼤多数经过了加密处理,因此⼀般⽤户看来只是⼀些毫⽆意义的字母数字组合,只有服务器的CGI处理程序才知道它们真正的含义。
1.3.
Cookie(复数形态Cookies),中⽂名称为⼩型⽂本⽂件或⼩甜饼,指某些⽹站为了辨别⽤户⾝份⽽储存在⽤户本地终端(Client Side)上的数据(通常经过加密)。定义于RFC2109。为⽹景公司的前雇员Lou Montulli在1993年3⽉所发明。
Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie。
内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。硬盘Cookie保存在硬盘⾥,有⼀个过期时间,除⾮⽤户⼿⼯清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。所以,按存在时间,可分为⾮持久Cookie和持久Cookie。
1.4. Cookie 规范
Http协议提供了有关Cookie的规范,现今市场上出现⼤量浏览器,⼀些浏览器对该Cookie规范进⾏了⼀些“扩展”,但Cookie缓存⽂件不会占满硬盘空间。Cookie存储的⼤⼩上限为4KB。⼀个服务器最多在客户端浏览器中可以保存20个Cookie。
⼀个浏览器最多可以保存300个Cookie。
值得注意的是,不同浏览器之间不能共享Cookie缓存⽂件。例如,上次使⽤IE浏览器访问⽹站,下次使⽤⽕狐浏览器访问该⽹站时,不能使⽤IE浏览器保存的Cookie缓存⽂件。
1.5. 第⼀个Cookie 下⾯我们通过具体操作来讨论⼀下Cookie在Web应⽤程序运⾏中的状态,具体操作如下:
创建⼀个Servlet⽤于向客户端发送Cookie信息。
[](javascript:void(0)
[](javascript:void(0)
创建另⼀个Servlet⽤于获取上次服务器端向客户端发送的Cookie信息。
[](javascript:void(0) public class CookieServlet1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1 利⽤UUID ⽣成⼀个随机字符串 String id = UUID.randomUUID().toString(); //2 创建Cookies 实例对象 Cookie cookie = new Cookie("id", id); //3 将Cookies 实例对象,添加到Response 对象中 response.addCookie(cookie); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
1
2
3
4
5
6
7
8
9
10
11
12
13
[](javascript:void(0)
配置Web⼯程的l⽂件。
[](javascript:void(0)
[](javascript:void(0) public class CookieServlet2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); //1 通过Request 对象获取上次服务器端发送的Cookie 信息 Cookie[] cookies = Cookies(); //2 判断Request 对象中的Cookie 是否存在 if(cookies != null){ //3 遍历Request 对象中的所有Cookie for (Cookie cookie : cookies) { //4 获取每⼀个Cookie 的名称 String n
ame = Name(); //5 判断Cookie 的名称是否存在是id if(name.equals("id")){ //6 打印Cookie 名称为id 的Cookie 值 Writer().println("你的ID 是"+Value()); } } } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 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<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="java.sun/xml/ns/javaee" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="java.sun/xml/ns/javaee java.sun/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <servlet> <servlet-name>CookieServlet1</servlet-name> <servlet-class>kie.CookieServlet1</servlet-class> </servlet> <servlet> <servlet-name>CookieServlet2</servlet-name> <servlet-class>kie.CookieServlet2</servlet-class> </servlet> <servlet-mapping> <servlet-name>CookieServlet1</servlet-name> <url-pattern>/cookie1</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>CookieServlet2</servlet-name> <url-pattern>/cookie2</url-pattern> </servlet-mapping> </web-app>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1.6. 显⽰上次访问时间案例
利⽤Cookie完成显⽰上次访问事件案例,⾸先需要分析⼀下整个案例的⼯作流程是怎么样的。
根据分析的⼯作流程,具体的操作步骤如下:
创建⼀个Servlet⽤于判断是否存在Cookies,并做出不同响应。
[](javascript:void(0)
[](javascript:void(0)
配置Web⼯程的l⽂件。
[](javascript:void(0) public class CookieServlet3 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = Writer(); //1 通过Request 对象获取请求中的Cookies Cookie[] cookies = Cookies(); //2 判断请求中的Cookies 是否存在 if(cookies != null){ //3 遍历所有Cookies for (Cookie cookie : cookies) { //4 获取每⼀个Cookies 的名称
String name = Name(); //5 判断是否存在⼀个名为"lastvisit"的Cookie if(name.equals("lastvisit")){ // 如果存在,说明不是第⼀次访问,显⽰上次访问的时间. out.println("<h1>你上次访问的时间是"+Value()+"</h1>"); } } }else{ // 如果不存在,说明是第⼀次访问,显⽰欢迎信息. out.println("<h1>欢迎访问XXX ⽹站.</h1>"); } // 创建⽤于显⽰最后⼀次访问时间的Cookie 实例对象 Cookie cookie = new Cookie("lastvisit", new Date().toString()); // 将Cookie 实例对象添加到Response 对象中 response.addCookie(cookie); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 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
28
29
30
31
32<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="java.sun/xml/ns/javaee" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="java.sun/xml/ns/javaee java.sun/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <servlet> <servlet-name>CookieServlet3</servlet-name> <servlet-class>kie.CookieServlet3</servlet-class> </servlet> <servlet-mapping> <servlet-name>CookieServlet3</servlet-name> <url-pattern>/cookie3</url-pattern> </servlet-mapping> </web-app>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论