Skip to content

Commit 9710d6f

Browse files
committed
update docs
1 parent ecfb9de commit 9710d6f

File tree

6 files changed

+211
-159
lines changed

6 files changed

+211
-159
lines changed

assets/tomcat.eddx

21.2 KB
Binary file not shown.

docs/javaee/README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
- [Java Web 整合开发王者归来](https://book.douban.com/subject/4189495/)
1515
- [Head First Servlets & JSP](https://book.douban.com/subject/1942934/)
1616
- **教程**
17-
- [博客园孤傲苍狼 JavaWeb 学习总结](https://www.cnblogs.com/xdp-gacl/tag/JavaWeb%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93/)
17+
- [深入拆解 Tomcat & Jetty](https://time.geekbang.org/column/intro/100027701)
1818
- [Servlet 教程](https://www.runoob.com/servlet/servlet-tutorial.html)
19+
- [博客园孤傲苍狼 JavaWeb 学习总结](https://www.cnblogs.com/xdp-gacl/tag/JavaWeb%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93/)
1920
- [JSP 教程](https://www.runoob.com/jsp/jsp-tutorial.html)

docs/javaee/javaee-cookie-sesion.md

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
# JavaEE 之 Cookie 和 Session
22

3-
## Cookie
3+
## 1. Cookie
44

55
由于 Http 是一种无状态的协议,服务器单从网络连接上无从知道客户身份。
66

77
会话跟踪是 Web 程序中常用的技术,用来跟踪用户的整个会话。常用会话跟踪技术是 Cookie 与 Session。
88

9-
### Cookie 是什么
9+
### 1.1. Cookie 是什么
1010

1111
Cookie 实际上是存储在客户端上的文本信息,并保留了各种跟踪的信息。
1212

@@ -20,7 +20,7 @@ Cookie 实际上是存储在客户端上的文本信息,并保留了各种跟
2020

2121
Java 中把 Cookie 封装成了`javax.servlet.http.Cookie`类。
2222

23-
### Cookie 剖析
23+
### 1.2. Cookie 剖析
2424

2525
Cookies 通常设置在 HTTP 头信息中(虽然 JavaScript 也可以直接在浏览器上设置一个 Cookie)。
2626

@@ -52,7 +52,7 @@ Accept-Charset: iso-8859-1,*,utf-8
5252
Cookie: name=xyz
5353
```
5454

55-
### Cookie 类中的方法
55+
### 1.3. Cookie 类中的方法
5656

5757
| 方法 | 功能 |
5858
| -------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
@@ -69,7 +69,7 @@ Cookie: name=xyz
6969
| public void setComment(String purpose) | 该方法规定了描述 cookie 目的的注释。该注释在浏览器向用户呈现 cookie 时非常有用。 |
7070
| public String getComment() | 该方法返回了描述 cookie 目的的注释,如果 cookie 没有注释则返回 null。 |
7171

72-
### Cookie 的有效期
72+
### 1.4. Cookie 的有效期
7373

7474
`Cookie``maxAge`决定着 Cookie 的有效期,单位为秒。
7575

@@ -79,31 +79,31 @@ Cookie: name=xyz
7979

8080
Cookie 中提供`getMaxAge()`****`setMaxAge(int expiry)`方法来读写`maxAge`属性。
8181

82-
### Cookie 的域名
82+
### 1.5. Cookie 的域名
8383

8484
Cookie 是不可以跨域名的。域名 www.google.com 颁发的 Cookie 不会被提交到域名 www.baidu.com 去。这是由 Cookie 的隐私安全机制决定的。隐私安全机制能够禁止网站非法获取其他网站的 Cookie。
8585

8686
正常情况下,同一个一级域名的两个二级域名之间也不能互相使用 Cookie。如果想让某域名下的子域名也可以使用该 Cookie,需要设置 Cookie 的 domain 参数。
8787

8888
Java 中使用`setDomain(Stringdomain)``getDomain()`方法来设置、获取 domain。
8989

90-
### Cookie 的路径
90+
### 1.6. Cookie 的路径
9191

9292
Path 属性决定允许访问 Cookie 的路径。
9393

9494
Java 中使用`setPath(Stringuri)``getPath()`方法来设置、获取 path。
9595

96-
### Cookie 的安全属性
96+
### 1.7. Cookie 的安全属性
9797

9898
HTTP 协议不仅是无状态的,而且是不安全的。
9999

100100
使用 HTTP 协议的数据不经过任何加密就直接在网络上传播,有被截获的可能。如果不希望 Cookie 在 HTTP 等非安全协议中传输,可以设置 Cookie 的 secure 属性为 true。浏览器只会在 HTTPS 和 SSL 等安全协议中传输此类 Cookie。
101101

102102
Java 中使用`setSecure(booleanflag)``getSecure ()`方法来设置、获取 Secure。
103103

104-
### Cookie 实例
104+
### 1.8. Cookie 实例
105105

106-
#### 添加 Cookie
106+
#### 1.8.1. 添加 Cookie
107107

108108
通过 Servlet 添加 Cookies 包括三个步骤:
109109

@@ -200,7 +200,7 @@ addCookies.jsp
200200
</html>
201201
```
202202

203-
#### 显示 Cookie
203+
#### 1.8.2. 显示 Cookie
204204

205205
要读取 Cookies,您需要通过调用 `HttpServletRequest``getCookies()` 方法创建一个 `javax.servlet.http.Cookie` 对象的数组。然后循环遍历数组,并使用 `getName()``getValue()` 方法来访问每个 cookie 和关联的值。
206206

@@ -277,7 +277,7 @@ public class ReadCookies extends HttpServlet {
277277
}
278278
```
279279

280-
#### 删除 Cookie
280+
#### 1.8.3. 删除 Cookie
281281

282282
Java 中并没有提供直接删除 Cookie 的方法,如果想要删除一个 Cookie,直接将这个 Cookie 的有效期设为 0 就可以了。步骤如下:
283283

@@ -359,17 +359,17 @@ public class DeleteCookies extends HttpServlet {
359359
}
360360
```
361361

362-
## Session
362+
## 2. Session
363363

364-
### Session 是什么
364+
### 2.1. Session 是什么
365365

366366
不同于 Cookie 保存在客户端浏览器中,Session 保存在服务器上。
367367

368368
如果说 Cookie 机制是通过检查客户身上的“通行证”来确定客户身份的话,那么 Session 机制就是通过检查服务器上的“客户明细表”来确认客户身份。
369369

370370
Session 对应的类为 `javax.servlet.http.HttpSession` 类。Session 对象是在客户第一次请求服务器时创建的。
371371

372-
### Session 类中的方法
372+
### 2.2. Session 类中的方法
373373

374374
`javax.servlet.http.HttpSession` 类中的方法:
375375

@@ -387,7 +387,7 @@ Session 对应的类为 `javax.servlet.http.HttpSession` 类。Session 对象是
387387
| public void setAttribute(String name, Object value) | 该方法使用指定的名称绑定一个对象到该 session 会话。 |
388388
| public void setMaxInactiveInterval(int interval) | 该方法在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位。 |
389389

390-
### Session 的有效期
390+
### 2.3. Session 的有效期
391391

392392
由于会有越来越多的用户访问服务器,因此 Session 也会越来越多。为防止内存溢出,服务器会把长时间没有活跃的 Session 从内存中删除。
393393

@@ -403,19 +403,19 @@ Tomcat 中 Session 的默认超时时间为 20 分钟。可以修改 web.xml 改
403403
</session-config>
404404
```
405405

406-
### Session 对浏览器的要求
406+
### 2.4. Session 对浏览器的要求
407407

408408
HTTP 协议是无状态的,Session 不能依据 HTTP 连接来判断是否为同一客户。因此服务器向客户端浏览器发送一个名为 JESSIONID 的 Cookie,他的值为该 Session 的 id(也就是 HttpSession.getId()的返回值)。Session 依据该 Cookie 来识别是否为同一用户。
409409

410410
该 Cookie 为服务器自动生成的,它的`maxAge`属性一般为-1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。
411411

412-
### URL 地址重写
412+
### 2.5. URL 地址重写
413413

414414
URL 地址重写的原理是将该用户 Session 的 id 信息重写到 URL 地址中。服务器能够解析重写后的 URL 获取 Session 的 id。这样即使客户端不支持 Cookie,也可以使用 Session 来记录用户状态。
415415

416416
`HttpServletResponse`类提供了`encodeURL(Stringurl)`实现 URL 地址重写。
417417

418-
### Session 中禁用 Cookie
418+
### 2.6. Session 中禁用 Cookie
419419

420420
`META-INF/context.xml`中编辑如下:
421421

@@ -426,9 +426,9 @@ URL 地址重写的原理是将该用户 Session 的 id 信息重写到 URL 地
426426

427427
部署后,TOMCAT 便不会自动生成名 JESSIONID 的 Cookie,Session 也不会以 Cookie 为识别标志,而仅仅以重写后的 URL 地址为识别标志了。
428428

429-
### Session 实例
429+
### 2.7. Session 实例
430430

431-
#### Session 跟踪
431+
#### 2.7.1. Session 跟踪
432432

433433
SessionTrackServlet.java
434434

@@ -510,7 +510,7 @@ web.xml
510510
</servlet-mapping>
511511
```
512512

513-
#### 删除 Session 会话数据
513+
#### 2.7.2. 删除 Session 会话数据
514514

515515
当您完成了一个用户的 session 会话数据,您有以下几种选择:
516516

@@ -534,41 +534,41 @@ web.xml
534534

535535
在一个 Servlet 中的 `getMaxInactiveInterval()` 方法会返回 session 会话的超时时间,以秒为单位。所以,如果在 web.xml 中配置 session 会话超时时间为 15 分钟,那么`getMaxInactiveInterval()` 会返回 900。
536536

537-
## Cookie vs Session
537+
## 3. Cookie vs Session
538538

539-
### 存取方式
539+
### 3.1. 存取方式
540540

541541
Cookie 只能保存`ASCII`字符串,如果需要存取 Unicode 字符或二进制数据,需要进行`UTF-8``GBK``BASE64`等方式的编码。
542542

543543
Session 可以存取任何类型的数据,甚至是任何 Java 类。可以将 Session 看成是一个 Java 容器类。
544544

545-
### 隐私安全
545+
### 3.2. 隐私安全
546546

547547
Cookie 存于客户端浏览器,一些客户端的程序可能会窥探、复制或修改 Cookie 内容。
548548

549549
Session 存于服务器,对客户端是透明的,不存在敏感信息泄露的危险。
550550

551-
### 有效期
551+
### 3.3. 有效期
552552

553553
使用 Cookie 可以保证长时间登录有效,只要设置 Cookie 的`maxAge`属性为一个很大的数字。
554554

555555
而 Session 虽然理论上也可以通过设置很大的数值来保持长时间登录有效,但是,由于 Session 依赖于名为`JESSIONID`的 Cookie,而 Cookie `JESSIONID``maxAge`默认为-1,只要关闭了浏览器该 Session 就会失效,因此,Session 不能实现信息永久有效的效果。使用 URL 地址重写也不能实现。
556556

557-
### 服务器的开销
557+
### 3.4. 服务器的开销
558558

559559
由于 Session 是保存在服务器的,每个用户都会产生一个 Session,如果并发访问的用户非常多,会产生很多的 Session,消耗大量的内存。
560560

561561
而 Cookie 由于保存在客户端浏览器上,所以不占用服务器资源。
562562

563-
### 浏览器的支持
563+
### 3.5. 浏览器的支持
564564

565565
Cookie 需要浏览器支持才能使用。
566566

567567
如果浏览器不支持 Cookie,需要使用 Session 以及 URL 地址重写。
568568

569569
需要注意的事所有的用到 Session 程序的 URL 都要使用`response.encodeURL(StringURL)``response.encodeRediretURL(String URL)`进行 URL 地址重写,否则导致 Session 会话跟踪失效。
570570

571-
### 跨域名
571+
### 3.6. 跨域名
572572

573573
* Cookie 支持跨域名。
574574
* Session 不支持跨域名。

0 commit comments

Comments
 (0)