Cookie 笔记
# 80.Cookie 笔记
HTTP 是无状态的,那么如何实现保持状态呢?
# 会话技术
什么是会话:一次会话中包含多次请求和响应。浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止(浏览器或服务器)。
会话的功能:在一次会话的范围内的多次请求间,共享数据(HTTP 是无状态的,想要共享数据要用会话数据)
生活中用到会话技术的例子:例如网购时,选中多个商品添加到购物车(每次添加都是一个请求);然后点击结算时,又是一个新的请求,如何知道之前的请求有什么数据(也就是用到之前的请求的数据)?使用会话技术。
共享数据有 2 种方式:
- 客户端会话技术:Cookie
- 服务器端会话技术:Session
# Cookie 快速入门
Cookie 的概念:客户端会话技术,将数据保存到客户端
实现原理:
- 基于响应头 set-cookie 和请求头 cookie 实现。
- 浏览器访问服务器后,服务器会返回一些数据给浏览器,并告知浏览器存储到本地;
- 当浏览器再次访问服务器的时候,会带上这些 Cookie
快速入门步骤:
- 创建 Cookie 对象,绑定数据
new Cookie(String name, String value)
- 发送 Cookie 对象给浏览器
response.addCookie(Cookie cookie)
- 服务器获取 Cookie,拿到数据
Cookie[] request.getCookies()
注意,Cookie 中不能有空格。如果想要存储,可以用 URL 编解码
我们写个 Servlet 来发送 Cookie 给浏览器:
package com.peterjxl.cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/cookieDemo1")
public class CookieDemo1 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.创建Cookie对象
Cookie c = new Cookie("msg", "HelloCookie");
//2.发送Cookie
resp.addCookie(c);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
重启 Tomcat,访问 http://localhost: 8080/hello/cookieDemo1,就会将 Cookie 保存到浏览器了,我们可以通过浏览器控制台查看:
# 获取 Cookie
接下来我们演示下如何在服务器中获取 Cookie:
package com.peterjxl.cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/cookieDemo2")
public class CookieDemo2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//3.获取Cookie
Cookie[] cs = req.getCookies();
// 遍历Cookie
if (cs != null){
for (Cookie c : cs) {
System.out.println(c.getName() + " : " + c.getValue());
}
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
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
重启 Tomcat,访问 http://localhost: 8080/hello/cookieDemo2,可以看到 IDE 里打印了所有 Cookie
msg : HelloCookie
注意,Cookie 是存储在浏览器里的,如果换个浏览器,Cookie 是不会同步到新的浏览器的。
# Cookie 原理
Cookie 的底层原理:还是通过 HTTP 协议,设置请求头和响应头来完成
服务器第一次响应:服务器发送的响应头是这样的:
HTTP/1.1 200 OK
set-cookie:msg=HelloCookie
2
然后浏览器访问服务器的时候,会将 Cookie 都带上,发送的请求头内容如下:
GET / HTTP/1.1
cooke:msg=HelloCookie
2
# 总结
会话技术可以使得每次 HTTP 请求之间共享数据
Cookie 是存储在浏览器里的,如果换个浏览器,Cookie 是不会同步到新的浏览器的。
- 01
- 中国网络防火长城简史 转载10-12
- 03
- 公告:博客近期 RSS 相关问题10-02