1.cookie
是客户端会话跟踪技术,它是存储在客户端浏览器的,我们使用
cookie
来跟踪会话,我们 就可以在浏览器第一次发起请求来请求服务器的时候,我们在服务器端来设置一个cookie
。
比如第一次请求了登录接口,登录接口执行完成之后,我们就可以设置一个
cookie
,在
cookie
当中 我们就可以来存储用户相关的一些数据信息。比如我可以在 cookie
当中来存储当前登录用户的用户 名,用户的ID
。服务器端在给客户端在响应数据的时候,会自动
的将
cookie
响应给浏览器,浏览器接收到响应回来 的 cookie
之后,会
自动
的将
cookie
的值存储在浏览器本地。接下来在后续的每一次请求当中, 都会将浏览器本地所存储的 cookie
自动
地携带到服务端。
2.接下来在服务端我们就可以获取到
cookie
的值。我们可以去判断一下这个
cookie
的值是否存
在,如果不存在这个
cookie
,就说明客户端之前是没有访问登录接口的;如果存在
cookie
的值,就 说明客户端之前已经登录完成了。这样我们就可以基于 cookie
在同一次会话的不同请求之间来共享数据。
我刚才在介绍流程的时候,用了
3
个自动:
服务器会
自动
的将
cookie
响应给浏览器。
浏览器接收到响应回来的数据之后,会
自动
的将
cookie
存储在浏览器本地。
在后续的请求当中,浏览器会
自动
的将
cookie
携带到服务器端。
为什么这一切都是自动化进行的?
是因为
cookie
它是
HTP
协议当中所支持的技术,而各大浏览器厂商都支持了这一标准。在
HTTP
协议官方给我们提供了一个响应头和请求头:
响应头
Set-Cookie
:设置
Cookie
数据的
请求头
Cookie
:携带
Cookie
数据的
代码测试
@Slf4j
@RestController
public class
SessionController
{
//
设置
Cookie
@GetMapping
(
"/c1"
)
public
Result cookie1
(
HttpServletResponse response
){
response
.
addCookie
(
new
Cookie
(
"login_username"
,
"itheima"
));
//
设置
Cookie/
响应
Cookie
return
Result
.
success
();
}
//
获取
Cookie
@GetMapping
(
"/c2"
)
public
Result cookie2
(
HttpServletRequest request
){
Cookie
[]
cookies
=
request
.
getCookies
();
for
(
Cookie cookie
:
cookies
) {
if
(
cookie
.
getName
().
equals
(
"login_username"
)){
System
.
out
.
println
(
"login_username:
"
+
cookie
.
getValue
());
//
输出
name
为
login_username
的
cookie
}
}
return
Result
.
success
();
}
}
优缺点
优点:
HTTP
协议中支持的技术(像
Set-Cookie
响应头的解析以及
Cookie
请求头数据的携
带,都是浏览器自动进行的,是无需我们手动操作的)
缺点:
移动端
APP(Android
、
IOS)
中无法使用
Cookie
不安全,用户可以自己禁用
Cookie
Cookie
不能跨域