1
1
# JavaEE 之 Cookie 和 Session
2
2
3
- ## Cookie
3
+ ## 1. Cookie
4
4
5
5
由于 Http 是一种无状态的协议,服务器单从网络连接上无从知道客户身份。
6
6
7
7
会话跟踪是 Web 程序中常用的技术,用来跟踪用户的整个会话。常用会话跟踪技术是 Cookie 与 Session。
8
8
9
- ### Cookie 是什么
9
+ ### 1.1. Cookie 是什么
10
10
11
11
Cookie 实际上是存储在客户端上的文本信息,并保留了各种跟踪的信息。
12
12
@@ -20,7 +20,7 @@ Cookie 实际上是存储在客户端上的文本信息,并保留了各种跟
20
20
21
21
Java 中把 Cookie 封装成了` javax.servlet.http.Cookie ` 类。
22
22
23
- ### Cookie 剖析
23
+ ### 1.2. Cookie 剖析
24
24
25
25
Cookies 通常设置在 HTTP 头信息中(虽然 JavaScript 也可以直接在浏览器上设置一个 Cookie)。
26
26
@@ -52,7 +52,7 @@ Accept-Charset: iso-8859-1,*,utf-8
52
52
Cookie: name=xyz
53
53
```
54
54
55
- ### Cookie 类中的方法
55
+ ### 1.3. Cookie 类中的方法
56
56
57
57
| 方法 | 功能 |
58
58
| -------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
@@ -69,7 +69,7 @@ Cookie: name=xyz
69
69
| public void setComment(String purpose) | 该方法规定了描述 cookie 目的的注释。该注释在浏览器向用户呈现 cookie 时非常有用。 |
70
70
| public String getComment() | 该方法返回了描述 cookie 目的的注释,如果 cookie 没有注释则返回 null。 |
71
71
72
- ### Cookie 的有效期
72
+ ### 1.4. Cookie 的有效期
73
73
74
74
` Cookie ` 的` maxAge ` 决定着 Cookie 的有效期,单位为秒。
75
75
@@ -79,31 +79,31 @@ Cookie: name=xyz
79
79
80
80
Cookie 中提供` getMaxAge() ` ** 和** ` setMaxAge(int expiry) ` 方法来读写` maxAge ` 属性。
81
81
82
- ### Cookie 的域名
82
+ ### 1.5. Cookie 的域名
83
83
84
84
Cookie 是不可以跨域名的。域名 www.google.com 颁发的 Cookie 不会被提交到域名 www.baidu.com 去。这是由 Cookie 的隐私安全机制决定的。隐私安全机制能够禁止网站非法获取其他网站的 Cookie。
85
85
86
86
正常情况下,同一个一级域名的两个二级域名之间也不能互相使用 Cookie。如果想让某域名下的子域名也可以使用该 Cookie,需要设置 Cookie 的 domain 参数。
87
87
88
88
Java 中使用` setDomain(Stringdomain) ` 和` getDomain() ` 方法来设置、获取 domain。
89
89
90
- ### Cookie 的路径
90
+ ### 1.6. Cookie 的路径
91
91
92
92
Path 属性决定允许访问 Cookie 的路径。
93
93
94
94
Java 中使用` setPath(Stringuri) ` 和` getPath() ` 方法来设置、获取 path。
95
95
96
- ### Cookie 的安全属性
96
+ ### 1.7. Cookie 的安全属性
97
97
98
98
HTTP 协议不仅是无状态的,而且是不安全的。
99
99
100
100
使用 HTTP 协议的数据不经过任何加密就直接在网络上传播,有被截获的可能。如果不希望 Cookie 在 HTTP 等非安全协议中传输,可以设置 Cookie 的 secure 属性为 true。浏览器只会在 HTTPS 和 SSL 等安全协议中传输此类 Cookie。
101
101
102
102
Java 中使用` setSecure(booleanflag) ` 和` getSecure () ` 方法来设置、获取 Secure。
103
103
104
- ### Cookie 实例
104
+ ### 1.8. Cookie 实例
105
105
106
- #### 添加 Cookie
106
+ #### 1.8.1. 添加 Cookie
107
107
108
108
通过 Servlet 添加 Cookies 包括三个步骤:
109
109
@@ -200,7 +200,7 @@ addCookies.jsp
200
200
< / html>
201
201
```
202
202
203
- #### 显示 Cookie
203
+ #### 1.8.2. 显示 Cookie
204
204
205
205
要读取 Cookies,您需要通过调用 ` HttpServletRequest ` 的 ` getCookies() ` 方法创建一个 ` javax.servlet.http.Cookie ` 对象的数组。然后循环遍历数组,并使用 ` getName() ` 和 ` getValue() ` 方法来访问每个 cookie 和关联的值。
206
206
@@ -277,7 +277,7 @@ public class ReadCookies extends HttpServlet {
277
277
}
278
278
```
279
279
280
- #### 删除 Cookie
280
+ #### 1.8.3. 删除 Cookie
281
281
282
282
Java 中并没有提供直接删除 Cookie 的方法,如果想要删除一个 Cookie,直接将这个 Cookie 的有效期设为 0 就可以了。步骤如下:
283
283
@@ -359,17 +359,17 @@ public class DeleteCookies extends HttpServlet {
359
359
}
360
360
```
361
361
362
- ## Session
362
+ ## 2. Session
363
363
364
- ### Session 是什么
364
+ ### 2.1. Session 是什么
365
365
366
366
不同于 Cookie 保存在客户端浏览器中,Session 保存在服务器上。
367
367
368
368
如果说 Cookie 机制是通过检查客户身上的“通行证”来确定客户身份的话,那么 Session 机制就是通过检查服务器上的“客户明细表”来确认客户身份。
369
369
370
370
Session 对应的类为 ` javax.servlet.http.HttpSession ` 类。Session 对象是在客户第一次请求服务器时创建的。
371
371
372
- ### Session 类中的方法
372
+ ### 2.2. Session 类中的方法
373
373
374
374
` javax.servlet.http.HttpSession ` 类中的方法:
375
375
@@ -387,7 +387,7 @@ Session 对应的类为 `javax.servlet.http.HttpSession` 类。Session 对象是
387
387
| public void setAttribute(String name, Object value) | 该方法使用指定的名称绑定一个对象到该 session 会话。 |
388
388
| public void setMaxInactiveInterval(int interval) | 该方法在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位。 |
389
389
390
- ### Session 的有效期
390
+ ### 2.3. Session 的有效期
391
391
392
392
由于会有越来越多的用户访问服务器,因此 Session 也会越来越多。为防止内存溢出,服务器会把长时间没有活跃的 Session 从内存中删除。
393
393
@@ -403,19 +403,19 @@ Tomcat 中 Session 的默认超时时间为 20 分钟。可以修改 web.xml 改
403
403
</session-config >
404
404
```
405
405
406
- ### Session 对浏览器的要求
406
+ ### 2.4. Session 对浏览器的要求
407
407
408
408
HTTP 协议是无状态的,Session 不能依据 HTTP 连接来判断是否为同一客户。因此服务器向客户端浏览器发送一个名为 JESSIONID 的 Cookie,他的值为该 Session 的 id(也就是 HttpSession.getId()的返回值)。Session 依据该 Cookie 来识别是否为同一用户。
409
409
410
410
该 Cookie 为服务器自动生成的,它的` maxAge ` 属性一般为-1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。
411
411
412
- ### URL 地址重写
412
+ ### 2.5. URL 地址重写
413
413
414
414
URL 地址重写的原理是将该用户 Session 的 id 信息重写到 URL 地址中。服务器能够解析重写后的 URL 获取 Session 的 id。这样即使客户端不支持 Cookie,也可以使用 Session 来记录用户状态。
415
415
416
416
` HttpServletResponse ` 类提供了` encodeURL(Stringurl) ` 实现 URL 地址重写。
417
417
418
- ### Session 中禁用 Cookie
418
+ ### 2.6. Session 中禁用 Cookie
419
419
420
420
在` META-INF/context.xml ` 中编辑如下:
421
421
@@ -426,9 +426,9 @@ URL 地址重写的原理是将该用户 Session 的 id 信息重写到 URL 地
426
426
427
427
部署后,TOMCAT 便不会自动生成名 JESSIONID 的 Cookie,Session 也不会以 Cookie 为识别标志,而仅仅以重写后的 URL 地址为识别标志了。
428
428
429
- ### Session 实例
429
+ ### 2.7. Session 实例
430
430
431
- #### Session 跟踪
431
+ #### 2.7.1. Session 跟踪
432
432
433
433
SessionTrackServlet.java
434
434
@@ -510,7 +510,7 @@ web.xml
510
510
</servlet-mapping >
511
511
```
512
512
513
- #### 删除 Session 会话数据
513
+ #### 2.7.2. 删除 Session 会话数据
514
514
515
515
当您完成了一个用户的 session 会话数据,您有以下几种选择:
516
516
@@ -534,41 +534,41 @@ web.xml
534
534
535
535
在一个 Servlet 中的 ` getMaxInactiveInterval() ` 方法会返回 session 会话的超时时间,以秒为单位。所以,如果在 web.xml 中配置 session 会话超时时间为 15 分钟,那么` getMaxInactiveInterval() ` 会返回 900。
536
536
537
- ## Cookie vs Session
537
+ ## 3. Cookie vs Session
538
538
539
- ### 存取方式
539
+ ### 3.1. 存取方式
540
540
541
541
Cookie 只能保存` ASCII ` 字符串,如果需要存取 Unicode 字符或二进制数据,需要进行` UTF-8 ` 、` GBK ` 或` BASE64 ` 等方式的编码。
542
542
543
543
Session 可以存取任何类型的数据,甚至是任何 Java 类。可以将 Session 看成是一个 Java 容器类。
544
544
545
- ### 隐私安全
545
+ ### 3.2. 隐私安全
546
546
547
547
Cookie 存于客户端浏览器,一些客户端的程序可能会窥探、复制或修改 Cookie 内容。
548
548
549
549
Session 存于服务器,对客户端是透明的,不存在敏感信息泄露的危险。
550
550
551
- ### 有效期
551
+ ### 3.3. 有效期
552
552
553
553
使用 Cookie 可以保证长时间登录有效,只要设置 Cookie 的` maxAge ` 属性为一个很大的数字。
554
554
555
555
而 Session 虽然理论上也可以通过设置很大的数值来保持长时间登录有效,但是,由于 Session 依赖于名为` JESSIONID ` 的 Cookie,而 Cookie ` JESSIONID ` 的` maxAge ` 默认为-1,只要关闭了浏览器该 Session 就会失效,因此,Session 不能实现信息永久有效的效果。使用 URL 地址重写也不能实现。
556
556
557
- ### 服务器的开销
557
+ ### 3.4. 服务器的开销
558
558
559
559
由于 Session 是保存在服务器的,每个用户都会产生一个 Session,如果并发访问的用户非常多,会产生很多的 Session,消耗大量的内存。
560
560
561
561
而 Cookie 由于保存在客户端浏览器上,所以不占用服务器资源。
562
562
563
- ### 浏览器的支持
563
+ ### 3.5. 浏览器的支持
564
564
565
565
Cookie 需要浏览器支持才能使用。
566
566
567
567
如果浏览器不支持 Cookie,需要使用 Session 以及 URL 地址重写。
568
568
569
569
需要注意的事所有的用到 Session 程序的 URL 都要使用` response.encodeURL(StringURL) ` 或` response.encodeRediretURL(String URL) ` 进行 URL 地址重写,否则导致 Session 会话跟踪失效。
570
570
571
- ### 跨域名
571
+ ### 3.6. 跨域名
572
572
573
573
* Cookie 支持跨域名。
574
574
* Session 不支持跨域名。
0 commit comments